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的方法.
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
。
-
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); } }
-
然后在主配置类中可以这样使用:
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被销毁的时候被调用的。比如关闭连接池、释放连接
本文来自博客园,作者:Eular,转载请注明原文链接:https://www.cnblogs.com/euler-blog/p/18616056
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通