Spring的控制翻转(IOC)与依赖注入(DI)

SpringIOC

即 Inversion of Control,缩写为 IOC,就是由 Spring IoC 容器管理对象,而非传统实现中由程序代码直接操控.

  • 使用IOC容器管理bean(IOC)

  • 在IOC容器中将有依赖关系的bean进行关系绑定

最终达到的目的:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean一旦有依赖关系,也是已经绑定了的。

为什么要使用IOC?

因为我们之前写的代码,耦合度是偏高的,例如我们的一个项目中,对类进行了改变,那么调用它创建这个对象的地方也需要改变,这就导致了一系列问题,重新测试、重新部署、重新编译、重新发布,这些都是有成本的。所以我们就追求一种低耦合高内聚的方式。

解决方式::使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象;

从 BookDao bd = new BookDao();

转为 BookDao bd ;

这种思想就称为IOC(Inversion of Control),控制反转,意思就是创建对象这件事代码不要做了,对象的控制权由程序转移到外部,这种思想称为控制反转

IOC与DI的最终目的?

IOC与DI的主要目的只有一个:充分解耦

spring如何实现IOC和DI思想?

  • spring提供了一个容器,称为IOC容器,用来充当IOC思想的“外部”,这个容器就是Core Container;

  • IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为Bean

  • 当类中还使用了其他类时,容器中建立bean与bean之间的依赖关系的整个过程,称为DI(Dependence Injection)依赖注入。

    多个关联使用的bean,IOC容器直接给你绑定好,绑定的这个过程,叫做依赖注入。

一些常见问题:

IOC管理的是什么?(Service和Dao)

如何将被管理的对象告知IOC容器? (通过配置)

被管理的对象交给IOC容器,如何获取到IOC容器?(通过接口)

IOC容器得到后,如何从容器中获取bean?(接口方法)

使用spring导入哪些坐标?pom.xml

 spring具体如何实现IOC和DI?

总体来说分为两种方式:XML配置文件  和  注解实现

1.基于XML管理

我们在spring.xml中对bean进行管理,在beans中我们对每一个需要使用的对象进行管理配置

(1)bean是什么?

bean指的是spring管理的对象,与我们自己new的对象不一样,spring可以对其添加额外功能。

bean中的属性介绍:

  1. id: 生成的对象名class 全类名

  2. name: 对象别名,可以为多个,用空格或“,”或”;“隔开即可,但是我们还是建议使用id

  3. scope: 定义创建的bean有几个

  • singleton(默认值):在 Spring 中只存在一个 bean 实例, 单例模式.

    为什么要默认单例?

    因为spring帮我们管理的对象例如dao和service都是可以复用的,我们并不需要每次都创建一个新的

    哪些是适合交给容器进行管理的bean?

    造一次就可以反复用的:

    表现层对象

    业务层对象

    数据层对象

    工具对象

    那些是不适合交给容器管理的bean?

    封装实体的域对象

  • prototype:原型getBean()的时候都会 new Bean()

  • request:每次 http请求都会创建一个 bean, 仅用于 WebApplicationContext环境

  • session:同一个 httpsession 共享一个 Bean, 不同 Session 使用不同的 Bean, 使用环境同上

    创建对象时注入数据的方式:

    set 方法注入 :在set方法中进行注入

    构造方法注入:在bean中进行注入

        
            
            
        

property是为这个bean对象的属性赋值或者是依赖注入,name表示具体的哪个属性,ref表示参照对应哪个bean(依赖注入),value设置默认值(基本类型时)

(2)我们在xml文件中配置完bean后,要怎么使用呢?

Spring的控制翻转(IOC)与依赖注入(DI)_第1张图片

 编写一个类,通过刚才的配置文件获取IOC容器,然后通过容器获取对象即可。

(3)bean是如何创建出来的?

实例化bean的三种方式:

1.提供可访问的构造方法

其实就是在类中提供无参构造即可

bean本质上还是对象,spring创建bean也是使用无参构造方法创建

我们把构造方法私有化以后,容器还是可以调用构造方法创建对象,要知道我们以前new对象的时候,private的构造方法是肯定不行的,那么spring是通过什么调用的呢?答案就是反射机制

2.使用静态工厂实例化bean

首先需要创建一个工厂用来生产bean,然后在配置文件中将工厂配置进去,让spring来管理工厂

(注:早期经常通过工厂方式解耦)

3.实例工厂初始化bean
4.spring特意对方式3进行了优化,有标准的实现

(4)bean的生命周期?

生命周期:从创建到消亡的完整过程

bean生命周期:bean从创建到销毁的整个过程

  • 初始化容器

    1. 创建对象(内存分配)

    2. 执行构造方法

    3. 执行属性注入(set操作)

    4. 执行bean初始化方法

  • 使用bean

    执行业务操作

  • 关闭/销毁容器

    执行bean销毁方法

(5)bean生命周期控制

生命周期控制就是在bean创建后到销毁前做一些事情 。

Spring的控制翻转(IOC)与依赖注入(DI)_第2张图片

(6)依赖注入(DI)的实现(手动实现)

DI就是当类中还使用了其他类时,容器中建立bean与bean之间的依赖关系的整个过程,称为DI(Dependence Injection)依赖注入。(其实就是为这个类赋初值)

1.setter方法注入

先写set方法:

Spring的控制翻转(IOC)与依赖注入(DI)_第3张图片

然后进行配置:

Spring的控制翻转(IOC)与依赖注入(DI)_第4张图片

 2.构造器注入

先写构造方法:

Spring的控制翻转(IOC)与依赖注入(DI)_第5张图片

 然后进行配置:

Spring的控制翻转(IOC)与依赖注入(DI)_第6张图片

 

注入方式的选择:

Spring的控制翻转(IOC)与依赖注入(DI)_第7张图片

 总之:自己写建议使用setter,第三方技术视情况而定,构造器注入是比较严谨的

(7)第三方bean管理

上面我们管理的bean都是我们自己创建的类,那么如果要管理外部的第三方类,就是从maven中导入的类时,应该怎么操作呢?

其实也是对bean进行配置,将管理权交给IOC容器管理,然后进行依赖注入(赋初值)即可。

例如与数据库连接的对象:

前提是先导入maven包,然后在配置文件中进行配置

Spring的控制翻转(IOC)与依赖注入(DI)_第8张图片

 以上就是我们使用xml配置应该注意的问题~

你可能感兴趣的:(spring进阶,spring,java,后端)