IOC(Inversion of Control):控制反转

本文介绍了IoC(InversionofControl)和依赖注入(DI)的基本概念,阐述了它们在Java开发中的作用,如何通过Spring框架实现,并强调了IoC的优点,如集中管理、功能复用和解耦。
摘要由CSDN通过智能技术生成

基本概念

IoC is also known as dependency injection (DI). It is a process whereby objects define their dependencies (that is, the other objects they work with) only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method. The container then injects those dependencies when it creates the bean. This process is fundamentally the inverse (hence the name, Inversion of Control) of the bean itself controlling the instantiation or location of its dependencies by using direct construction of classes or a mechanism such as the Service Locator pattern.

翻译

IOC与大家熟知的依赖注入同理,. 这是一个通过依赖注入对象的过程 也就是说,它们所使用的对

象,是通过构造函数参数,工厂方法的参数或这是从工厂方法的构造函数或返回值的对象实例设置

的属性,然后容器在创建bean时注入这些需要的依赖。 这个过程相对普通创建对象的过程是反向

的(因此称之为IoC),bean本身通过直接构造类来控制依赖关系的实例化或位置,或提供诸如服

务定位器模式之类的机制。

概述

IOC是一种设计思想,在Java开发中,将你设计好的对象交给容器控制,而不是显示地用代码进行

对象的创建。

把创建和查找依赖对象的控制权交给 IoC 容器,由 IoC 容器进行注入、组合对象之间的关系。这

样对象与对象之间是松耦合、功能可复用(减少对象的创建和内存消耗),使得程序的整个体系结

构可维护性、灵活性、扩展性变高。 所谓IOC ,就简短一句话:对象由spring来创建、管理,装

配!

为什么使用IOC

你可以想象一下,假如当年设计鼠标键盘的人直接焊在电脑主板芯片上,没有鼠标就主板就废了启

动不了,鼠标出现问题导致主板出现问题,外设坏了想换要拆开重新焊一个上去,这样的扩展性,

可维护性 多差! 所以设计者提供一个接口出来可以接受不同的外设?并且让外设变成可插拔?

每次鼠标坏了需要拆开电脑,重新焊一个鼠标上去。导致代码的变更巨大,任何的变更都会加大造

成系统BUG的可能性。

接口分离原则ISP(the Interface Segregation Principle ISP)

模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来

不要将鼠标(具体实现)直接焊在主板上,使用插口(抽象)连接;

现在接口有了,但是无法热插拔。 每次鼠标坏了需要关掉电脑才能更换(实现类换了还是需要去变更代码)

依赖倒置原则DIP(the Dependency Inversion Principle DIP)

具体实现依赖抽象,下层依赖上层。 分离

依赖倒置原则使鼠标、键盘和电脑成为独立的的互不相干的对象,当电脑(上层)没有鼠标可以正常启动但是鼠标(下层)没有电脑则一无是处 ,控制权就被反转了(IOC)。 所以鼠标需要依赖USB(DI)才能使用。

之前——正转: 主板---焊接--->鼠标 电脑没有鼠标则无法启动

现在——反转: 电脑

IOC是DIP的设计原理,DI是IOC的具体实现

鼠标坏了很快就可以换一个,虽然会涉及短暂无法使用, 但是产生的变更极少。

IOC代码实现

最low的实现方式:导入jar包---配置xml 入门 搭建基于ioc的spring

导入jar包实现

访问:spring仓库JFrog 下载任意版本的spring

只需要下载dist.zip - 包含了docs schema

配置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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="cn.dao.UserDao" id="userDao"></bean>

    <bean class="cn.service.UserService" id="userService">
        <property name="dao" ref="userDao"></property>
    </bean>
</beans>

一般实现方式:maven+注解+xml

需要导入jar 配置maven依赖

配置pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.com.spring</groupId>
    <artifactId>spring_ioc</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
    </dependencies>

</project>

添加spring配置文件:

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="cn.beans.User" id="user"></bean>
</beans>

编写测试类:

public class IocTest {
    @Test
    public void test01(){
        ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc.xml");
        User bean = ioc.getBean(User.class);
        System.out.println(bean);
    }
}

最屌实现方式:springboot+javaconfig

总结

DI与IOC

很多人把IOC和DI说成一个东西,笼统来说的话是没有问题的,但是本质上还是有所区别的,希望大

家能够严谨一点,IOC和DI是从不同的角度描述的同一件事,IOC是从容器的角度描述,而DI是从

应用程序的角度来描述,也可以这样说,IOC是依赖倒置原则的设计思想,而DI是具体的实现方式

在面向对象设计的软件系统中,底层的实现都是由N个对象组成的,所有的对象通过彼此的合作,

最终实现系统的业务逻辑。

有一个对象出了问题,就可能会影响到整个流程的正常运转。现在,伴随着工业级应用的规模越来

越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构

师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现

牵一发而动全身的情形。

大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC容器,对象和对象之间没有了耦合关

系, 它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个

“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。

通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控

制权颠倒过来了,这就是“控制反转”这个名称的由来。

ioc优点

        集中管理

        功能可复用(减少对象的创建和内存消耗)

        使得程序的整个体系结构可维护性、灵活性、扩展性变高

        解耦

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值