一、IoC 相关概念
1、什么是 IoC?
IoC Inversion of Control (控制反转/反转控制),注意它是一个技术思想,不是一个技术实现。
描述的事情:Java 开发领域对象的创建,管理的问题。
传统开发方式:比如类 A 依赖于类 B,往往会在类 A 中 new 一个 B 的对象。
IoC 思想下开发方式:我们不用自己去 new 对象了,而是由 IoC 容器(Spring 框架)去帮助我们实例化对象并且管理它,我们需要使用哪个对象,去问 IoC 容器要即可。
我们丧失了一个权利(创建、管理对象的权利),得到了一个福利(不用考虑对象的创建、管理等一系列事情)。
2、为什么叫做控制反转?
控制:指的是对象创建(实例化、管理)的权利。
反转:控制权交给外部环境了(Spring 框架、IoC 容器)。
3、IoC 解决了什么问题?
IoC 解决对象之间的耦合问题。
- 其实就是把具体实例化对象的步骤交给容器处理。
- 是否单例、是否重新实例化新的对象这些操作也都交给容器负责。
- 而要用到的类里的属性也会变成接口,是哪个具体实现类也不需要知晓,到时候直接拿接口向容器要实例化后的对象就行。
下面是用 service 层和 dao 层下的接口、实现类进行举例:
4、IoC 和 DI 的区别
IoC:Inversion of Control(控制反转/反转控制);
DI:Dependancy Injection(依赖注入)。
IoC 和 DI 描述的是同一件事情(对象实例化及依赖关系维护这件事情),只不过⻆度不一样罢了。
IoC 是站在对象的角度,对象实例化及其管理的权利交给了(反转)给了容器。
DI 是站在容器的角度,容器会把对象依赖的其他对象注入(送进去),比如 A 对象实例化过程中因为声明了一个 B 类型的属性,那么就需要容器把 B 对象注入到 A。
二、Spring IoC 基础概念
1、 BeanFactory 与 ApplicationContext 区别:
BeanFactory 是 Spring 框架中 IoC 容器的顶层接口,它只是用来定义一些基础功能,定义一些基础规范,
而 ApplicationContext 是它的一个子接口,所以 ApplicationContext 是具备 BeanFactory 提供的全部功能的;
通常,我们称 BeanFactory 为 SpringIoC 的基础容器,
ApplicationContext 是容器的高级接口,比 BeanFactory 要拥有更多的功能,比如说国际化支持和资源访问(xml,java 配置类)等等。
2、Bean 的 X 及生命周期
1)作用范围的改变
在 spring 框架管理 Bean 对象的创建时,Bean 对象默认都是单例的,但是它支持配置的方式改变作用范围。
范围 | 说明 |
---|---|
singleton | (默认值)每个 Spring IoC 容器将单个 bean 定义范围限制到单个对象实例。 |
protoype | 将单个 bean 定义的作用域限定为任意数量的对象实例。 |
request | 将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期;也就是说,每个 HTTP 请求都有一个自己的 bean 实例,它是在单个 bean 定义的后面创建。仅在可感知网络的 Spring ApplicationContext 中有效。 |
session | 将单个 bean 定义的范围限定为 HTTP Session 的生命周期。仅在可感知网络的 Spring ApplicationContext 上下文中有效。 |
application | 将单个 bean 定义的范围限定为 ServletContext 的生命周期。仅在可感知网络的 Spring ApplicationContext 上下文中有效。 |
websocket | 将单个 bean 定义的范围限定为 WebSocket 的生命周期。仅在可感知网络的 Spring ApplicationContext 上下文中有效。 |
应用配置:
<!--配置service对象-->
<bean id="transferService" class="com.lagou.service.impl.TransferServiceImpl"
scope="singleton"></bean>
2)不同作用范围的生命周期
模式名称 | 单例模式:singleton | 多例模式:prototype |
---|---|---|
对象出生 | 当创建容器时,对象就被创建了。 | 当使用对象时,创建新的对象实例。 |
对象活着 | 只要容器在,对象一直活着。 | 只要对象在使用中,就一直活着。 |
对象死亡 | 当销毁容器时,对象就被销毁了。 | 当对象⻓时间不用时,被 java 的垃圾回收器回收了。 |
一句话总结 | 单例模式的 bean 对象生命周期与容器相同。 | 多例模式的 bean 对象,spring 框架只负责创建,不负责销毁。 |
3、Bean 标签属性
在基于 xml 的 IoC 配置中,bean 标签是最基础的标签。它表示了 IoC 容器中的一个对象。
换句话说,如果一个对象想让 spring 管理,在 XML 的配置中都需要使用此标签配置,Bean 标签的属性如下:
1)id 属性:
用于给 bean 提供一个唯一标识。在一个标签内部,标识必须唯一。
2)class 属性:
用于指定创建 Bean 对象的全限定类名。
3)name 属性:
用于给 bean 提供一个或多个名称。多个名称用空格分隔。
4)factory-bean 属性:
用于指定创建当前 bean 对象的工厂 bean 的唯一标识。当指定了此属性之后, class 属性失效。
5)factory-method 属性:
用于指定创建当前 bean 对象的工厂方法,如配合 factory-bean 属性使用,则 class 属性失效。如配合 class 属性使用,则方法必须是 static 的。
6)scope 属性:
用于指定 bean 对象的作用范围。通常情况下就是 singleton。当要用到多例模式时,可以配置为 prototype。
7)init-method 属性:
用于指定 bean 对象的初始化方法,此方法会在 bean 对象装配后调用。必须是 一个无参方法。
8)destory-method 属性:
用于指定 bean 对象的销毁方法,此方法会在 bean 对象销毁前执行。它只能为 scope 是 singleton 时起作
三、DI 依赖注入的 xml 配置
1、依赖注入分类
1)按照注入的方式分类
构造函数注入:顾名思义,就是利用带参构造函数实现对类成员的数据赋值。
set 方法注入:它是通过类成员的set方法实现数据的注入。(使用最多的)
2)按照注入的数据类型分类
基本类型和 String
注入的数据类型是基本类型或者是字符串类型的数据。
其他 Bean 类型
注入的数据类型是对象类型,称为其他 Bean 的原因是,这个对象是要求出现在 IoC 容器中的。那么针对当前 Bean 来说,就是其他 Bean 了。
复杂类型(集合类型)
注入的数据类型是 Array,List,Set,Map,Properties 中的一种类型。
2、依赖注入的配置实现之构造函数注入
顾名思义,就是利用构造函数实现对类成员的赋值。
它的使用要求是,类中提供的构造函数参数个数必须和配置的参数个数一致,且数据类型匹配。
同时需要注意的是,当没有无参构造时,则必须提供构造函数参数的注入,否则 Spring 框架会报错。
public