SpringBean是Spring容器初始化、装配、管理的对象,Bean的定义以及之间的依赖通过配置元数据来表示。
Bean的作用域
Bean的默认作用域是单例的,即Spring容器中只会存在某个Bean的一个对象,通过多线程处理多个请求。如果想要Bean保持一些状态,单例可能就不是线程安全的,这时候可以把作用域设置为prototype的。
Spring支持物种Bean的作用域,通过在Bena定义中配置<bean id="" class="" scope="singleton"
:
singleton
单例多线程处理多个请求
prototype
每次请求Bean(依赖注入或者getBean方法)都会new一个Bean对象
request
每次HttpRequest都会创建一个Bean对象
session
同一个session共享一个Bean对象,不同session使用不同Bean对象
globalSession
类似于session,仅在portlet应用下使用
Bean的生命周期
默认情况下,bean是和Spring容器一起初始化的,但是可以配置bean延迟加载,使它真正被请求的时候才初始化。
管理Bean的初始化和销毁
我们可以在Bean初始化完成和销毁之前做一些事情,我们可以通过实现接口、配置化和注解 三种方式指定完成的动作。
InitializingBean和DisposableBean接口
这两个接口分别有一个方法,分别在Bean属性值set完成和销毁前被调用,这两个方法是afterPropertiesSet和destroy
在Bean定义中指定init-method和destroy-method
使用@PostConstruct和@PreDestroy注解
这两个注解相当于指定init和destroy
BeanPostProcessor
Bean后处理器有两个方法,分别在Bean初始化开始前和完成后被调用(注意这里的初始化不是jvm层面的,而是开发者对Bean定制的初始化过程)
Bean生命周期总结
Bean的生命周期大致分为初始化和销毁两个过程。我们可以对Bean的初始化和销毁过程进行管理。可以对所有Bean统一管理,通过实现BeanPostProcessor接口在所有Bean初始化前和初始化完成两个时间点进行管理。
也可以对某个Bean进行定制化管理,对某个Bean初始化进行管理可以通过@PostConstruct注解方法、实现InitialzingBean接口的afterPropertiesSet方法、配置Bean杜希昂的init-method属性 这三种方法进行,对某个Bean的销毁过程进行管理可以通过@PreDestroy注解方法、实现DisposableBean接口的destroy方法、配置bean对象的destroy-method 这三种方法进行。
注意,Spring IOC容器不会管理prototype作用域的Bean的销毁过程,即为prototype Bean设置的销毁方法一概不会调用
下面是所有的Bean生命周期的时间点:
- Spring容器初始化
===================
- Bean的无参构造方法
- setter
- *Aware接口的方法
- BeanPostProcessor的postProcessBeforeInitialization方法
- @PostConstruct注解的方法
- InitializingBean接口的afterPropertiesSet方法
- init-method
- BeanPostProcessor的postProcessAfterInitialization方法
- Spring容器初始化完毕
===================
- 从容器中获取Bean
===================
- @PreDestroy注解的方法
- DisposableBean接口的destroy方法
- destroy-method
- Spring容器关闭