Spring IoC 基础概念

一、IoC 相关概念

1、什么是 IoC?

IoC Inversion of Control (控制反转/反转控制),注意它是一个技术思想,不是一个技术实现。
描述的事情:Java 开发领域对象的创建,管理的问题。
传统开发方式:比如类 A 依赖于类 B,往往会在类 A 中 new 一个 B 的对象。
IoC 思想下开发方式:我们不用自己去 new 对象了,而是由 IoC 容器(Spring 框架)去帮助我们实例化对象并且管理它,我们需要使用哪个对象,去问 IoC 容器要即可。
我们丧失了一个权利(创建、管理对象的权利),得到了一个福利(不用考虑对象的创建、管理等一系列事情)。

2、为什么叫做控制反转?

控制:指的是对象创建(实例化、管理)的权利。
反转:控制权交给外部环境了(Spring 框架、IoC 容器)。

3、IoC 解决了什么问题?

IoC 解决对象之间的耦合问题。

  1. 其实就是把具体实例化对象的步骤交给容器处理。
  2. 是否单例、是否重新实例化新的对象这些操作也都交给容器负责。
  3. 而要用到的类里的属性也会变成接口,是哪个具体实现类也不需要知晓,到时候直接拿接口向容器要实例化后的对象就行。

下面是用 service 层和 dao 层下的接口、实现类进行举例:

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、依赖注入的配置实现之构造函数注入

顾名思义,就是利用构造函数实现对类成员的赋值。
它的使用要求是,类中提供的构造函数参数个数必须和配置的参数个数一致,且数据类型匹配。
同时需要注意的是,当没有无参构造时,则必须提供构造函数参数的注入,否则 Spr

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jason559

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值