依赖注入原理,作用,注入方式

前言

上一章我们讲到了IOC和DI概述:
https://blog.csdn.net/qq_34598667/article/details/83275560
这一章接上一章继续讲
依赖注入(Dependency Injection)是用于实现控制反转(Inversion of Control)的最常见的方式之一。本文主要在于介绍依赖注入的含义以及原理,为初学者理清头绪


为什么需要依赖注入?

第一个问题,上一章我们主要介绍了控制反转的含义,依赖注入实现了控制反转,那么控制反转的作用是什么?——解耦
那么问题有来了,依赖注入如何实现解耦呢?
首先我们来看一下在没有使用依赖注入下的代码,顺便给大家回顾一下耦合的概念

什么是耦合度?

对象之间的关系,通常说当一个模块(对象)更改时也需要更改其他模块(对象),这就是耦合,耦合度过高会使代码的维护成本增加。要尽量解耦
举例说明:

public class UserService{//创建dao接口引用指向实现类对象--直接创建对象private UserDao userDao=new UserDaoImpl();//调用dao方法 返回一个User对象public User login(String userName,String password){return userDao.login(userName,password);}
}

仔细观察上述代码:
我们在UserService中创建了一个登陆的login方法,但是实际上完成登陆功能的是UserDaoImpl的登录login方法。我们使用UserDaoImpl的login方法时是直接创建了一个属性UserDao的方式(也有人使用无参构造,在无参构造中使用new创建对象)
那么问题来了,如果现在我需要修改UserDaoImpl的构造方式,在实例化时添加一个属性作为参数,那么我不仅要修改UserDaoImpl中的代码,还要修改所有与UserService中相同的创建UserDaoImpl类型对象的代码。
这种在UserService中创建UserDaoImpl的方式,不仅让UserService依赖于UserDao接口,还依赖于UserDaoImpl。这种就是耦合度过高的体现,也是依赖注入需要解决的问题。

耦合度过高带来的问题

1、修改一处代码会导致很多代码都要修改,修改不方面
2、无法单独测试
3、可读性差(如果一段代码不便于测试,那么它一定不便于阅读)


依赖注入的方式

拔掉外衣看依赖注入,其实它并不复杂,相反其实我们在很多地方都写过,这里介绍一下依赖注入的三种方式:

1)构造器注入

我们修改一下上面的代码,让UserService只依赖于UserDao接口,而不依赖与UserDaoImpl实现类

public class UserService{//创建dao接口引用指向实现类对象--直接创建对象private UserDao userDao;//使用有参构造方法public UserService(UserDao userDao){this.userDao=userDao;}
}

2)setter注入

同样的,我们也可以使用增加一个setter的方式来传入一个创建好的UserDaoImpl对象

public class UserService{//创建dao接口引用指向实现类对象--直接创建对象private UserDao userDao;public void setUserDao(UserDao userDao){this.userDao=userDao;}
}

3)接口注入

接口注入是使用接口来提供setter方法,首先得创建一个接口

public interface InjectDao{void injectDaoImpl(UserDao userDao);
}

然后让UserService实现该接口

public class UserService implements InjectDao{//创建dao接口引用指向实现类对象--直接创建对象private UserDao userDao;public void injectDaoImpl(UserDao userDao){this.userDao=userDao;}
}

最后,重点是我们要根据不用的框架来完成依赖注入。


总结

把对抽象接口类型的对象的赋值放在类外面,把new出来的对象放在外面传入进来,那就不用依赖具体的实现类。

下一章,Spring中完成依赖注入的方式:
https://blog.csdn.net/qq_34598667/article/details/83308071

依赖注入原理,作用,注入方式——Spring IOC/DI(二)相关推荐

  1. Spring IOC (DI) 依赖注入的四种方式

    依赖注入的四种方式: set 注入 赋值,默认使用的是set() 方法,依赖注入底层是通过反射实现的 <bean id="student" class="cust. ...

  2. 依赖注入的三种方式_Spring IoC是如何进行依赖注入的

    依赖注入(DI) DI(Dependency Injection),Spring IoC 不是一种技术,而是一种思想,通过这种思想,能够指导我们设计出松耦合的程序代码.而Spring IoC这个思想的 ...

  3. Spring Ioc/DI 控制反转和依赖注入

    Ioc(Inversion of Control)和DI(Dependency Injection)的全称分别是控制反转和依赖注入. 如何理解这两个概念呢? Ioc Ioc(控制反转)实际上就说把对象 ...

  4. sql注入原理及防范方式

    前言 sql注入是一种危险系数较高的攻击方式,现在由于我们持久层框架越来越多,大部分框架会处理这个问题,因此导致我们对它的关注度越来越少了.最近部门在整理安全漏洞时,提到了一些关于sql注入的修改点, ...

  5. WEB漏洞攻防- SQL注入原理、判定方式、过滤及修复

    文章目录 SQL注入漏洞原理 结合简单的代码案例分析SQL注入漏洞是如何产生的 判断是否存在注入 最原始的判断是否存在注入的方式 传入的字符对页面内容存在影响极有可能存在注入 如何过滤.修复SQL注入 ...

  6. spring ioc di 原理解析

    spring ioc原理(看完后大家可以自己写一个spring) 控制反转/依赖注入 其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.Java程序员都知道:java程序中 ...

  7. SQL注入原理-POST注入

    小伙伴们大家好!本期为大家带来的是SQL注入原理之POST注入. 目录 GET传参与POST传参 什么是POST注入? 实战演示 一.判断是否存在注入点 二.万能密码 三.判断查询字段个数 四.找出可 ...

  8. mysql的注入原理_mysql 注入原理以及防范

    一.注入原理 通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令 二.实例 1.建表sql CREATE TABLE `web_safe` ( ...

  9. 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )

    文章目录 一.进程注入原理 二.远程调用流程 ( 获取 so 动态库地址 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 ) 一.进程注入原理 调试进程 At ...

  10. 2.spring IOC(DI)

    1. IOC(DI) - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和 ...

最新文章

  1. JS 函数 函数递归
  2. solr kerberos java_solr添加kerberos认证及授权
  3. python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析
  4. HTTP-FLV直播初探-flv.js播放器使用实例
  5. CV之IS:计算机视觉之图像分割(Image Segmentation)/语义分割算法的简介、使用方法、案例应用之详细攻略
  6. Kafka发送超过broker限定大小的消息时Client和Broker端各自会有什么异常?
  7. libcurl上传文件
  8. nginx负载均衡的5种策略
  9. 苹果进行iPhone问世后最重大转型:硬件时代转互联网服务
  10. oracle 用户表、字段信息
  11. 苹果cmsv10自适应高仿时光影院视频网站免费模板
  12. CI框架全局登录控制
  13. Cisco Packet Tracer 实验
  14. rl滤波器原理_RL低通滤波器的原理是什么
  15. 黄帝内经.素问.脉要精微论篇(17)
  16. 学英语查单词:快乐英语,简单生活,why not Bing EngKoo!?
  17. 微服务架构-高性能Netty服务器-064:Netty实战与反序列化与序列化协议
  18. 微信小程序聊天客服工具
  19. c语言双字节异或,C语言 按位异或实现加法
  20. PC_二进制移位运算/定点数移位/算数移位及其移位后的空位添补规则/机器数位数扩充

热门文章

  1. 【生信进阶练习1000days】day6-OrganismDb packages
  2. Exponentially Weighted Averages
  3. 739.每日温度 (力扣leetcode) 博主可答疑该问题
  4. jquery migrate 应用迁移辅助插件
  5. 在Android studio环境下使用junit框架进行单元测试
  6. file_operation(文件操作)file(文件)inode(节点)
  7. linux python 链接 oracle
  8. Java final关键字详解
  9. 抽象类、接口、内部类
  10. mysqlplus 字段验证策略fieldStrategy