• spring中IoC和DI浅析


    IoC和DI都是spring框架中的重要概念,通常也是成对出现的,下面对IoC和DI及其关系进行简单分析。
    1、IoC
    IoC(Inversion of Control),控制反转,它不是一个具体的技术,而是一个实现对象解耦的思想。
    其中,耦合是指两个或两个以上对象存在依赖关系,当一方修改之后会影响另一方,那么就说这些对象存在耦合。而解耦就是解除两个或两个以上对象,修改其中一方之后影响另一方的问题。
    那么IoC如何实现解耦?
    如,A对象中需要使用B对象的某个方法,那么通常的实现方法是这样的:

    class A {
        public void init() {
            // 调用 B 类中的 init 方法
            B b = new B();
            b.init();
        }
    }
    class B {
        public B() {
        }
    
        public void init() {
            System.out.println("你好,世界。");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    此时对象A和对象B是存在耦合的,因为一旦修改了B对象构造方法的参数之后,那么A对象里的写法也要跟着改变,如将构造方法改为如下:

    class B {
        public B(String name) {
            System.out.println("姓名:" + name);
        }
        
        public void init() {
            System.out.println("你好,世界。");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    此时B对象的构造方法已经从原来的无参变为了有参,那么之前A对象里的调用就会报错,这里不考虑构造方法重载的情况。
    这时可以通过将对象传递而并非new对象的方式来解决,如下所示:

    class A {
        // 先定义一个需要依赖的 B 对象
        private B b;
        // 通过构造方法实现赋值(初始化)
        public A(B b) {
            this.b = b;
        }
        public void init() {
            // 调用 B 类中的 init 方法
            b.init();
        }
    }
    class B {
        public B(String name) {
            System.out.println("姓名:" + name);
        }
        public void init() {
            System.out.println("你好,世界。");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这样改造之后,无论构造方法怎么修改,即使加了很多的参数,而调用它的A类都无需做任何修改,这样就实现了对象的解耦。
    上面的示例和IoC实现解耦的思路是一样的,就是通过将对象交给spring中IoC容器管理,在其他类中不直接new对象,而是通过将对象传递到当前类的方式来实现解耦。
    在new对象的时代,对象的管理权是由当前类控制的,而有了IoC之后,对象的管理权就交给非当前类的IoC容器管理了,此时对象的管理权就发生了反转和改变,这就是IoC,控制(权)反转。

    2、DI
    DI(Dependency Injection),依赖注入,它不是一种设计实现,而是一种具体的技术。依赖注入是在IoC容器运行期间,动态的将某个依赖对象注入到当前对象的技术就叫做DI依赖注入。
    在上面示例中,A类在使用B类时,就是通过构造方法将依赖对象B引入的,这种实现方法就可以看作是通过构造方法实现依赖注入的手段,如下:

    class A {
        // 先定义一个需要依赖的 B 对象
        private B b;
        // 通过构造方法实现赋值
        public A(B b) {
            this.b = b;
        }
        public void init() {
            // 调用 B 类中的 init 方法
            b.init();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在spring中,通常是采用注解@Autowired或@Resource进行依赖注入。

    3、关系
    IoC和DI虽然定义不同,但他们所做的事情都是一样的,就是都是用来实现对象解耦的;不同之处是IoC是一种设计思想,而DI是一种具体的实现技术。
    IoC就是容器,DI就是注入这一行为,那么DI就是IoC具体功能的实现,所以IoC和DI是相辅相成的拍档,都是为了实现对象解耦。

  • 相关阅读:
    【21学习挑战赛——华为OD机试JAVA】
    js 正则校验输入是否为空字符串
    SpringBoot全局异常处理请求参数校验及响应体包装
    四则运算Java版
    【编程题】【Scratch四级】2021.09 找出出现次数最多的数字
    新老电脑的文件/数据同步记录
    “图”学习提纲
    资深博导:我以为数据预处理是常识,直到遇到自己的学生
    apijson 初探
    css实现圆角三角形,圆角三角形的实现
  • 原文地址:https://blog.csdn.net/leijie0322/article/details/126361170