本文最后更新于2 分钟前,文中所描述的信息可能已发生改变。
Sring中Bean的生命周期
bean
信息先会被封装为一个个BeanDefinition
对象。- 将
BeanDefinition
放入一个BeanDefinitionMap
中,键为定义的名字,未指定名字则默认为类全限定名。 - 遍历
BeanDefinitionMap
实例化Bean。
- 初始化
Bean
,进行属性注入。 - 将初始化后的
Bean
放入单例池SingletonObjects
中,也是一个Map
。
该阶段是生命周期中最复杂与重要的阶段,AOP等扩展点就是在该阶段完成
实现InitializingBean
接口可自定义初始化InitializingBean
回调逻辑
java
@Component
public class MyInitializingBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
//自定义初始化逻辑
}
}
初始化中属性注入阶段
Spring中的三级缓存机制解决循环引用
实例化后还未进行初始化的BeanDefinition先放入三级缓存;实例化后还未完成初始化,但是被引用则放入二级缓存;实例化后初始化也完成则放入三级缓存,是完整的
Bean
实例。
Spring当中的扩展点
通过接口
BeanFactoryPostProcessor
与BeanPostProcessor
可以干涉到Bean
的生命周期,对Bean进行配置,比如以单例还是多例的形式产生Bean
实例。
BeanFactoryPostProcessor
接口 主要是对BeanDefinition
进行操作postProcessBeanFactory
方法:在BeanDefinition
封装完放入Map
中之后实例化之前执行,可以对BeanDefinition
进行修改与注册。BeanDefinitionRegisterPostProcess
接口:BeanFactoryPostProcessor
的子接口,主要用来向Map
中注册BeanDefinition
。
该类被注入到容器后会被自动调用
java
@Component
public class MyBeanFactoryPostProcess implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
//获取到了beanDefinition信息,可以对其进行修改
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("");
if(beanFactory instanceof DefaultListableBeanFactory){
//强转为子类
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
//构造beanDefinition
RootBeanDefinition definition = new RootBeanDefinition();
definition.setBeanClassName("");
//进行注册到beanDefinitionMap中
defaultListableBeanFactory.registerBeanDefinition("",definition);
}
}
}
该类被注入到容器后会被自动调用
java
@Component
public class MyBeanDefinitionRegisterPostProcess implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
//专门进行beanDefinition注册与删除
RootBeanDefinition definition = new RootBeanDefinition();
definition.setBeanClassName("类全限定名");
beanDefinitionRegistry.registerBeanDefinition("注入到容器中的bean的名字",definition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
//可以修改beanDefinition的信息与注册
}
}
BeanPostProcessor
接口 主要是对实例化后属性注入完成后的Bean
进行操作postProcessBeforeInitialization
方法:在Bean
实例化之后,初始化方法执行之前执行postProcessAfterInitialization
方法:在Bean
实例化之后,初始化方法执行之后执行
该类被注入到容器后会被自动调用
java
@Component
public class MyBeanPostProcess implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//在实例化的bean属性注入完毕后执行init方法之前执行
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//在实例化的bean执行init方法之后执行
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
}
Aware扩展点
总结
通过Spring提供的扩展点我们可以操作容器中的Bean也可以将我们自定义的Bean注入到容器中,可以很方便的实现我们自己的程序与Spring框架进行整合,也能进一步加深我们对IOC的理解并实践到我们自己的
以上图片均来自网络