Bean Life cycle

创建时间轴

1,调用Bean的构造函数(或者工厂方法)实例化Bean.
2,对Bean的成员变量赋值.
3,如果Bean实现了,调用Bean的setBeanName方法.
4,如果Bean实现了BeanFactoryAware,调用Bean的setBeanFactory方法.
5,如果Bean实现了ApplicationContextAware,调用Bean的!setApplicationContext方法.
6,如果容器中配置了BeanPostProcessor,调用BeanPostProcessor的postProcessBeforeInitialization方法(如果有多个BeanPostProcessor,调用每一个BeanPostProcessor的postProcessBeforeInitialization方法).
6,如果Bean实现了InitializingBean,调用Bean的afterPropertiesSet方法.
7,如果Bean配置了init-method方法,调用init-method配置的Bean方法.
8,如果容器中配置了BeanPostProcessor,调用BeanPostProcessor的postProcessAfterInitialization方法.(如果有多个BeanPostProcessor,调用每一个BeanPostProcessor的postProcessAfterInitialization方法).
9,Bean处于可以使用的状态.
10,Spring容器关闭.
11,如果Bean实现了DisposableBean,调用Bean的destroy方法.
12,如果Bean配置了destroy-method方法,调用destroy-method配置的Bean的方法.
image


Bean的初始化方法执行顺序

InstantiationAwareBeanPostProcessor 无参构造实例化

BeanPostProcessor初始化前后

@postConstruct

InitializingBean 的 afterPropertiesSet方法

部分类的职责

DeferredImportSelector 用来扩展添加bean的,通过添加bean的全名字

AbstractAutowireCapableBeanFactory 用来给be an进行属性赋值的

AutowiredAnnotationBeanPostProcessor 用来解析Autowired 和Value注解的

org.springframework.beans.factory.support.AbstractBeanFactory#resolveEmbeddedValue 解析value的

全流程

1.BeanDefinitionRegistryPostProcessor 重点是beanDefinitionRegistry可以向容器扩展自己的beanDefinition

2.ImportBeanDefinitionRegistrar 结合@Import来使用

​ 例如,一个日志插件可以通过这种方式注册自己的日志记录器Bean

  1. import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
    import org.springframework.core.type.AnnotationMetadata;
    
    public class LogPluginBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinition(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            // 注册日志插件相关的BeanDefinition,如日志记录器Bean
            BeanDefinition beanDefinition = new GenericBeanDefinition();
            beanDefinition.setBeanClassName("com.example.LogPluginLogger");
            registry.registerBeanDefinition("logPluginLogger", beanDefinition);
        }
    }
    
  2. 然后在主配置类中可以这样使用:

    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Import;
    
    @Configuration
    @Import(LogPluginBeanDefinitionRegistrar.class)
    public class AppConfig {
        // 主配置类的其他配置
    }
    

3.InstantiationAwareBeanPostProcessor extends BeanPostProcessor ,是BeanPostProcessor的一种扩展,对创建Bean之前或者时候进行扩展,比如通过创建的代理对象,实现事务的执行:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class CustomInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        // 假设这里对需要事务管理的Bean进行代理创建,这只是一个简单示例
        if (beanClass.isAnnotationPresent(Transactional.class)) {
            return createTransactionProxy(beanClass);
        }
        return null;
    }

    // 其他方法可以根据需要实现,如postProcessAfterInstantiation等
}

4.BeanPostProcessor中的postProcessBeforeInitialization、postProcessAfterInitialization 分别设置初始化前后的工作。例如:可以对Bean进行包装或者添加后置处理逻辑

5.InitializingBean是bean的属性全部设置完成后被调用。比如创建线程池。

6.DisposableBean是在bean被销毁的时候被调用的。比如关闭连接池、释放连接

posted @   Eular  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示