Spring Bean (作用域,依赖注入四种方式,生命周期)

4 篇文章 0 订阅

附带Spring5 种不同方式的自动装配

一.Spring Bean 作用域

Spring 3 中为 Bean 定义了 5 中作用域,分别为 singleton(单例)、prototype(原型)、request、session 和 global session,5 种作用域说明如下:

singleton:单例模式(多线程下不安全)

1. singleton:单例模式,Spring IoC 容器中只会存在一个共享的 Bean 实例,无论有多少个Bean 引用它,始终指向同一对象。该模式在多线程下是不安全的。Singleton 作用域是Spring 中的缺省作用域,也可以显示的将 Bean 定义为 singleton 模式,配置为:

prototype:原型模式每次使用时创建

2. prototype:原型模式,每次通过 Spring 容器获取 prototype 定义的 bean 时,容器都将创建一个新的 Bean 实例,每个 Bean 实例都有自己的属性和状态,而 singleton 全局只有一个对象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。

Request:一次 request 一个实例

3. request:在一次 Http 请求中,容器会返回该 Bean 的同一实例。而对不同的 Http 请求则会产生新的 Bean,而且该 bean 仅在当前 Http Request 内有效,当前 Http 请求结束,该 bean实例也将会被销毁。

session

4. session:在一次 Http Session 中,容器会返回该 Bean 的同一实例。而对不同的 Session 请求则会创建新的实例,该 bean 实例仅在当前 Session 内有效。同 Http 请求相同,每一次session 请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的 session 请求内有效,请求结束,则实例将被销毁。

global Session

5. global Session:在一个全局的 Http Session 中,容器会返回该 Bean 的同一个实例,仅在使用 portlet context 时有效。

二. Spring Bean 生命周期

实例化

1. 实例化一个 Bean,也就是我们常说的 new。

IOC 依赖注入

2. 按照 Spring 上下文对实例化的 Bean 进行配置,也就是 IOC 注入。

setBeanName 实现

3.如果这个Bean已经实现了BeanNameAware接口 ,会调用它实现的 setBeanName(String)方法,此处传递的就是 Spring 配置文件中 Bean 的 id 值

BeanFactoryAware 实现

4. 如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory,

setBeanFactory(BeanFactory)传递的是 Spring 工厂自身(可以用这个方式来获取其它 Bean,只需在 Spring 配置文件中配置一个普通的 Bean 就可以)。

ApplicationContextAware 实现

5. 如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用

setApplicationContext(ApplicationContext)方法,传入 Spring 上下文(同样这个方式也可以实现步骤 4 的内容,但比 4 更好,因为 ApplicationContext 是 BeanFactory 的子接口,有更多的实现方法)

postProcessBeforeInitialization 接口实现-初始化预处理

6. 如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用

postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor 经常被用作是 Bean 内容的更改,并且由于这个是在 Bean 初始化结束时调用那个的方法,也可以被应用于内存或缓存技术。

init-method

7. 如果 Bean 在 Spring 配置文件中配置了 init-method 属性会自动调用其配置的初始化方法。

postProcessAfterInitialization

8. 如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用

postProcessAfterInitialization(Object obj, String s)方法。

注:以上工作完成以后就可以应用这个 Bean 了,那这个 Bean 是一个 Singleton 的,所以一般情况下我们调用同一个 id 的 Bean 会是在内容地址相同的实例,当然在 Spring 配置文件中也可以配置非 Singleton。

Destroy 过期自动清理阶段

9. 当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用那个其实现的 destroy()方法;

destroy-method 自配置清理

10. 最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法。

Spring Bean (作用域,依赖注入四种方式,生命周期)

 

11. bean 标签有两个重要的属性(init-method 和 destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct 和@PreDestroy)。

三.Spring 依赖注入四种方式

构造器注入

Spring Bean (作用域,依赖注入四种方式,生命周期)

 

setter 方法注入

Spring Bean (作用域,依赖注入四种方式,生命周期)

 

静态工厂注入

静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让 spring 管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过 spring 注入的形式获取:

Spring Bean (作用域,依赖注入四种方式,生命周期)

 

实例工厂

实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先 new 工厂类,再调用普通的

实例方法:

Spring Bean (作用域,依赖注入四种方式,生命周期)

 

四.种不同方式的自动装配

Spring 装配包括手动装配和自动装配,手动装配是有基于 xml 装配、构造方法、setter 方法等

自动装配有五种自动装配的方式,可以用来指导 Spring 容器用自动装配方式来进行依赖注入。

1. no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。

2. byName:通过参数名 自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。

3. byType:通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。

4. constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。

5. autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。

  • 8
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Bean 的作用域生命周期Spring 框架中非常重要的概念。 作用域Spring Bean 的作用域指的是 Bean 实例的创建和销毁方式Spring 支持多种 Bean 的作用域,包括 Singleton、Prototype、Request、Session、Global Session 等。 - Singleton:单例模式,一个 Bean 实例在整个应用中只被创建一次。 - Prototype:原型模式,每次从容器中获取 Bean 时都会创建一个新的实例。 - Request:每个 HTTP 请求都会创建一个 Bean 实例,该 Bean 实例仅在当前 HTTP 请求内有效。 - Session:每个 HTTP Session 都会创建一个 Bean 实例,该 Bean 实例仅在当前 HTTP Session 内有效。 - Global Session:该作用域仅适用于基于 Portlet 的 Web 应用,每个全局 HTTP Session 都会创建一个 Bean 实例,该 Bean 实例仅在当前全局 HTTP Session 内有效。 生命周期Spring Bean 的生命周期指的是 Bean 实例的创建、初始化和销毁过程。Spring 容器负责管理 Bean 的生命周期Bean 生命周期包括以下几个阶段: - 实例化:创建 Bean 实例。 - 属性赋值:将 Bean 实例的属性值注入到 Bean 实例中。 - 初始化:调用 Bean 的初始化方法。 - 使用:Bean 实例可以被容器和其他 Bean 使用。 - 销毁:容器关闭或者手动销毁 Bean 实例时,调用 Bean 的销毁方法。 Spring Bean 的生命周期可以通过 BeanPostProcessor、InitializingBean 和 DisposableBean 接口、@PostConstruct 和 @PreDestroy 注解等方式进行定制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值