Spring中Bean的生命周期及其扩展点

本文总阅读量
本文最后更新于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当中的扩展点

通过接口BeanFactoryPostProcessorBeanPostProcessor可以干涉到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的理解并实践到我们自己的

以上图片均来自网络

多线程设计模式之两阶段终止模式
Netty简单使用
Valaxy v0.18.5 驱动 | 主题 - Yun v0.18.5
本站总访问量
本站访客数 人次
本站已运行0 天0 小时0 分0 秒后缀