Bean的生命周期
在Java应用中,普通的Java Bean的生命周期很简单。使用关键字new
对Bean进行实例化,之后Bean就可使用了,当Bean不在被使用就会被Java的垃圾回收机制回收。概括的说就是两个阶段:
- 实例化
- 不使用之后垃圾回收
Spring的Bean的生命周期则比较复杂,Spring的Bean由IOC
容器进行实例化、组装和管理。IOC(Inversion of Control,控制反转)
是一种软件设计原则,用于实现松耦合和可维护的代码结构。
Spring Bean的生命周期主要分为四个部分
在Spring框架中,Bean的生命周期经历了以下几个阶段:
- 实例化(Instantiation):Spring容器根据配置信息或注解创建Bean的实例。
- 属性赋值(Populate):Spring容器将属性值和依赖注入到Bean中。
- 设置Bean名称:如果Bean实现了
BeanNameAware
接口,将会调用setBeanName()
方法,把Bean的名称传递给它。 - 设置BeanFactory的引用:如果Bean实现了
BeanFactoryAware
接口,将会调用setBeanFactory()
方法,把Bean所在的BeanFactory传递给它。 - 设置其他自定义上下文:如果Bean实现了
ApplicationContextAware
接口,将会调用setApplicationContext()
方法,把ApplicationContext传递给它。 - Bean后处理(BeanPostProcessor):Spring容器会对所有的BeanPostProcessor进行初始化,这些后处理可以对Bean实例化前后进行一些自定义操作。
- 初始化(Initialization):如果Bean实现了
InitializingBean
接口,将会调用afterPropertiesSet()
方法来执行自定义初始化逻辑。另外,还可以通过配置文件使用init-method
属性制定Bean的初始化方法。 - 自定义初始化(Custom Initialization):在Bean初始化之后,可以执行一些自定义的初始化逻辑。
- 销毁(Destruction):如果Bean实现了
DisposableBean
接口,将会调用destroy()
方法来执行自定义销毁逻辑。同样,还可以通过配置文件使用destory-method
属性制定Bean的初始化方法。 - 自定义销毁(Custom Destruction):在 Bean 销毁之前,可以执行一些自定义的销毁逻辑。
Bean的生命周期可以通过配置方式进行管理,例如使用XML配置或者是注解。同时,Spring还提供了各种扩展点和回调接口,使开发者能够在Bean的生命周期的不同阶段进行定制化操作。
扩展点
Spring如果监测到Bean实现了Aware
接口,则会为其注入相应的依赖。因此通过让Bean实现Aware
接口,能够让Bean获得相应的Spring容器资源
Aware
接口:
- BeanNameAware:注入当前Bean对应的名称
- BeanClassLoaderAware:注入加载当前Bean的ClassLoader
- BeanFactoryAware:注入当前BeanFactory的引用
BeanPostProcessor
BeanPostProcessor
是Spring的一个重要的接口,用于在Bean初始化前后进行扩展和自定义处理。它是Bean生命周期的一部分,主要用于在容器实例化Bean和将其添加到应用程序上下文之后,以及Bean初始化前后对Bean的定制化操作。
|
|
- postProcessBeforeInitialization(Object bean, String beanName):Bean初始化之前调用该方法。接收两个参数:正在初始化的Bean的对象和Bean的名称。可以对此方法中的Bean进行修改和增强。如果返回的对象不为null,则该对象作为最终的Bean实例。
- postProcessAfterInitialization(Object bean, String beanName):在Bean初始化之后调用该方法。接收两个参数:已经完成初始化的Bean对象和Bean的名称。可以对此方法中的Bean进行修改和增强。如果返回的对象不为null,则该对象作为最终的Bean实例。
通过实现BeanPostProcessor
接口,在Spring容器实例化Bean和初始化Bean的过程中介入,可以实现一些功能:
- 属性值的校验、修正和增强。
- 动态代理,用于实现AOP的切面
- 注入依赖关系的解析和处理
- 条件化的Bean的创建和初始化
- 对Bean进行包装或装饰