一、控制反转

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方法对对象进行赋值。

一、Spring的控制反转(IOC)学习的更多相关文章

  1. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  2. Spring入门--控制反转(IOC)与依赖注入(DI)

        1.控制反转(Inversion of Control)与依赖注入(Dependency Injection) 控制反转即IoC (Inversion of Control).它把传统上由程序 ...

  3. Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)

    关于依赖注入, 这篇博文写的非常简单易懂. https://github.com/android-cn/blog/tree/master/java/dependency-injection 此外, 博 ...

  4. spring(3)------控制反转(IOC)/依赖注入(DI)

    一.spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control).它把传统上由程序代码直接操控的对象的调用权交给容器.通过容器来实现对象组件的装配和管理. 所谓 ...

  5. Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了IoC的基础含义,同时以此发散了一些IoC相关知识点; 本节将在此基础上进一步解读IOC的含义以及IOC的使用方式.@pd ...

  6. Spring的控制反转(IOC)和依赖注入(DI)具体解释

    Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...

  7. 浅析“依赖注入(DI)/控制反转(IOC)”的实现思路

    开始学习Spring的时候,对依赖注入(DI)——也叫控制反转(IOC)—— 的理解不是很深刻.随着学习的深入,也逐渐有了自己的认识,在此记录,也希望能帮助其他入门同学更深入地理解Spring.本文不 ...

  8. 控制反转IOC的依赖注入方式

    引言: 项目中遇到关于IOC的一些内容,因为和正常的逻辑代码比较起来,IOC有点反常.因此本文记录IOC的一些基础知识,并附有相应的简单实例,而在实际项目中再复杂的应用也只是在基本应用的基础上扩展而来 ...

  9. 控制反转IOC与依赖注入DI【转】

    转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...

随机推荐

  1. ROM定制开发教程-Android adb命令用法与实例解析

    一.什么是ADB Android Debug Bridge(adb)是一个命令行工具,可让您与模拟器或连接的Android设备进行通信.您可以在android sdk / platform-tools ...

  2. sysbench安装和使用

    sysbench是一款测试工具 主要包括以下几种方式的测试: 1.cpu性能 2.磁盘io性能 3.调度程式性能 4.内存分配及传输速度 5.POSIX线程性能 6.数据库性能(OLTP基准测试)现在 ...

  3. 深圳博客第一篇(Json)

    JSON JSON是纯文本 JSON具有自我描述性 JSON具有层级结构 JSON可通过javascript进行解析 JSON数据可使用Ajax进行传输 JSON对象的取值 var myObj = { ...

  4. Flutter Weekly Issue 52

    教程 一个易迁移.兼容性高的 Flutter 富文本方案 复杂业务如何保证Flutter的高性能高流畅度? 插件 flutter_color_models A wrapper for the Dart ...

  5. 4.加密与token(node+express)

    一. 敏感数据加密1.安装并引入中间件     npm install utility     const utils = require('utility')2.加密方法     function ...

  6. jmeter并发时生成唯一变量

    vars.put("partnerOrderId","ZS"+Thread.currentThread().getId()+System.currentTime ...

  7. this 关键字的用法

    用法一  this代表当前类的实例对象 class Program    {        static void Main(string[] args)        {            tr ...

  8. Bi-LSTM+CRF在文本序列标注中的应用

    传统 CRF 中的输入 X 向量一般是 word 的 one-hot 形式,前面提到这种形式的输入损失了很多词语的语义信息.有了词嵌入方法之后,词向量形式的词表征一般效果比 one-hot 表示的特征 ...

  9. MySQL优化之COUNT(*)效率(部分转载与个人亲测)

    说到MySQL的COUNT(*)的效率,发现越说越说不清楚,干脆写下来,分享给大家. COUNT(*)与COUNT(COL)网上搜索了下,发现各种说法都有:比如认为COUNT(COL)比COUNT(* ...

  10. 任意文件下载(pikachu)

    任意文件下载漏洞 很多网站都会提供文件下载功能,即用户可以通过点击下载链接,下载到链接所对应的文件. 但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获取到后台服务器上的其他 ...