一、控制反转

1、什么是控制反转?

  控制反转(Inversion of Control,缩写为IoC),是面向对象中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

  也就是说:控制反转就是存在一个系统管理者(一般设计为一个类),这个管理者管理类与类之间的依赖关系,以达到解耦的目的,使类与类之间的依赖降低。具体形象表述如下图:

2、java中的例子

   我们设计如下三个类。

其中执行的逻辑为:

UserServiceImpl通过调用userDao对象,来执行具体userDao对象中的方法。

 public class UserDaoMysqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("mysql获取用户数据");
}
}

UserDaoOracleImpl.java

 public class UserDaoOracleImpl implements UserDao{
@Override
public void getUser() {
System.out.println("oracle获取用户数据");
}
}

UserServiceImpl.java

public class UserServiceImpl implements UserService{

    private UserDao userDao =new UserDaoOracleImpl();//如果想获取Mysql,需要更改代码

    @Override
public void getUser() {
userDao.getUser();
}
}

上述代码存在的问题:

  1. 对象与对象之间的依赖为硬编码在代码中,需要更动时需要修改代码、重新编译。
  2. 没有良好的代码复用性,每次更改需求都需要重新更改源代码。

解决方案如下

public class UserServiceImpl implements UserService{

    private UserDao userDao ;

    public void setUserDao(UserDao ud){
this.userDao=ud;
}
@Override
public void getUser() {
userDao.getUser();
}
}

​ 经过set方式对userDao对象通过set方法设置值,降低了代码之间的耦合度,提高了复用性。但仍存在不足,对象与对象之间的依赖仍然存在于代码中。作为Spring的两大核心之一的IOC,Spring如何解决这个问题?

二、Spring中如何实现控制反转IOC

1、实现思想

​ spring中实现控制反转的方式为依赖注入(DI),也就是将对象之间的 依赖统一注入到IOC容器中,由Spring的IOC容器统一托管,当需要使用对象时,只需要向IOC容器申请即可。

2、具体实现

(1)、applicationContext.xml

​ 首先需要创建applicationContext.xml文件,将涉及到的对象注入到配置文件中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="mysql" class="com.ming.dao.UserDaoMysqlImpl"></bean>
<bean id="oracle" class="com.ming.dao.UserDaoOracleImpl"></bean> <bean id="userService" class="com.ming.service.UserServiceImpl">
<property name="userDao" ref="oracle"></property>
</bean>
</beans>

(2)、执行测试类

public class DemoTest {
public static void main(String[] args) {
ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
UserService us=(UserService) ac.getBean("userService");
us.getUser();
}
}

(3)、查看运行结果

修改配置文件中的ref为mysql时、运行结果为:

3、IOC实现原理

​ Spring实现IOC的原理为反射机制,属性注入的实质为Set注入,即通过Set方法对对象进行赋值。

最新文章

  1. office2016各个版本 以及 解决visio搜索任何都提示无匹配项问题
  2. test1.A[【dfs简单题】
  3. 【Eclipse】几个最重要的快捷键
  4. Atom插件安装及常用插件推荐
  5. [转]30分钟学会反向Ajax
  6. struts2 拦截器 interceptor
  7. HDU 1850 (Nim博弈 取胜方案数) Being a Good Boy in Spring Festival
  8. LeetCode题解——Add Two Numbers
  9. IDEA的使用
  10. 1、shell 简介
  11. formData 无需form异步上传多个图片
  12. 刨根问底:if 后怎么就可以跟对象,变量交换写法是语法糖吗?
  13. CSS——img自适应div大小
  14. MHA-Atlas-MySQL高可用集群
  15. Exp6 信息搜集与漏洞扫描 20164313 杜桂鑫
  16. python+pycharm环境搭建
  17. CSS硬件加速的好与坏
  18. Window丢失api-ms-win-crt-runtime-l1-1-0.dll
  19. jenkins Pipeline 使用
  20. 爬虫初窥day3:BeautifulSoup

热门文章

  1. C# windows服务没有RunInstallerAttribute.Yes的公共安装程序
  2. Python递归爬取头条用户的所有文章、视频
  3. DNA sequence HDU - 1560(IDA*,迭代加深搜索)
  4. E - Travel by Car
  5. 配置CORS代理请求
  6. wordpress 常用操作
  7. pytorch-API实现线性回归
  8. numpy+sklearn 手动实现逻辑回归【Python】
  9. 杂园日记-获取URL参数
  10. 聊聊Spring Boot Actuator