什么叫控制反转

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么叫控制反转相关的知识,希望对你有一定的参考价值。

参考技术A 问题一:java中的控制反转是什么意思? 很简单 ,就是本来你该做的事情 你不去做了 让系统去做,比如,你获取一个对象的时候,往往需要new出实例来,如果用了控制反转,那这件事情 就不需要你做了,你只需要在配置文件xml中配置好,系统就帮你new
控制反转也叫依赖注入,就是把该用到的东西 提前注入进去,下次直接用 而不是每次都new
这够通俗的了吧 希望你能明白

问题二:面试时介绍spring框架什么是控制反转 有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三方机构:婚姻介绍所。婚介管理
了很多男男女女的资料,我可以向婚介所提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林林志玲,唱歌像刘德华,速度像刘翔,身高
像姚明之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛
出异常。整个过程不再由我自己控
制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什
么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由
spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象
都被spring控制,所以这叫控制反转。
参考:blog.163/...18382/

问题三:控制反转的实现方式 实现数据访问层数据访问层有两个目标。第一是将数据库引擎从应用中抽象出来,这样就可以随时改变数据库―比方说,从微软SQL变成Oracle。不过在实践上很少会这么做,也没有足够的理由未来使用实现数据访问层而进行重构现有应用的努力。 第二个目标是将数据模型从数据库实现中抽象出来。这使得数据库或代码开源根据需要改变,同时只会影响主应用的一小部分――数据访问层。这一目标是值得的,为了在现有系统中实现它进行必要的重构。模块与接口重构依赖注入背后的一个核心思想是单一功能原则(single responsibility principle)。该原则指出,每一个对象应该有一个特定的目的,而应用需要利用这一目的的不同部分应当使用合适的对象。这意味着这些对象在系统的任何地方都可以重用。但在现有系统里面很多时候都不是这样的。 随时增加单元测试把功能封装到整个对象里面会导致自动测试困难或者不可能。将模块和接口与特定对象隔离,以这种方式重构可以执行更先进的单元测试。按照后面再增加测试的想法继续重构模块是诱惑力的,但这是错误的。 使用服务定位器而不是构造注入实现控制反转不止一种方法。最常见的办法是使用构造注入,这需要在对象首次被创建是提供所有的软件依赖。然而,构造注入要假设整个系统都使用这一模式,这意味着整个系统必须同时进行重构。这很困难、有风险,且耗时。

问题四:控制反转的优缺点 IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点像USB接口和SCSI硬盘了)。IoC最大的缺点是什么?(1)生成一个对象的步骤变复杂了(事实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。(2)对象生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。(3)缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。

问题五:spring中的控制反转为什么叫控制反转?控制什么了?反转什么了? IoC(Inversion of control): 控制反转
控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系

问题六:控制反转和依赖注入的区别 概念:
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。
依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造子注入(Constructor Injection)
区别:
控制反转:创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重于原理。
依赖注入:创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。

问题七:依赖注入和控制反转的区别 依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
不管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。在理解依赖注入之前,看如下这个问题在各种社会形态里如何解决:一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。

问题八:控制反转和面向切面说的是一个问题吗 不是同一个问题。
控制反转(IOC)
用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
面向切面编程,即AOP,是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。

问题九:什么是IoC控制反转 控制反转其实就是对象字段或属性赋值publicclassControlList_data=null;这部分就是IOC控制器给你new出来赋值,具体是ArrayList还是其他的根据配置来

问题十:控制反转和依赖注入的区别 依赖注入IOC技术现在很流行,主要是spring带动起来的,IOC最典型的应用就是控制反转DI。 大致意思就是减少类间耦合度,避免用new来创建对象。

Spring的控制反转(IOC)学习

一、控制反转

1、什么是控制反转?

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

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

img

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

以上是关于什么叫控制反转的主要内容,如果未能解决你的问题,请参考以下文章

“依赖注入”,“控制反转”是指啥?

控制反转(IOC)和依赖注入(DI)的区别

Java的依赖注入(控制反转)

Spring的控制反转(IOC)学习

Spring IOC(控制反转)示例解析

深入理解IoC/DI