getBean和后置处理器的9次干预
2023-06-25 16:52:16 0 举报
在Spring框架中,getBean方法是一个非常重要的环节。它负责从容器中获取指定名称的bean实例。然而,这个过程并不简单,因为在实际应用中,我们通常会使用后置处理器对bean进行一些额外的处理。这些后置处理器可以在bean创建、初始化、销毁等阶段对其进行干预。在一次典型的getBean调用中,可能会涉及到9次后置处理器的干预,包括:前置处理器1-5、初始化后置处理器1-3以及销毁后置处理器1-2。这些处理器共同协作,确保bean在整个生命周期中都能得到适当的处理,从而提高应用程序的稳定性和可维护性。
作者其他创作
大纲/内容
是
是否创建了代理对象
bean创建完成后
getSingleton(beanName)
我们自己返回
InitializingBean#afterPropertiesSet();//属性设置完后做事
有
applyBeanPostProcessorsAfterInitialization
进入一下bean实例化流程
有没有依赖的组件
第八次调用后置处理器,Spring内置后置处理器中,只有ApplicationListenerDetector有处理逻辑,ApplicationListenerDetector会将实现了ApplicationListener接口的bean添加到事件监听器列表中
决定使用构造器
典型代表
封装了当前bean的所有属性名和值,可以由后置处理器处理得到
font color=\"#323232\
SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference第四次,在getEarlyBeanReference中,使用beanPostProcessor对早期bean进行处理,如在AOP中生成代理对象
拿好创建好的对象
createBean()//结束
是否获取到bean
构造器方式自动装配创建bean
对象创建成功
ApplicationContextAwareProcessor注入
// 拿到整个beanFactory的父工厂;看父工厂没有,从父工厂先尝试获取组件; BeanFactory parentBeanFactory = getParentBeanFactory();
createBean()//开始创建bean
创建bean的实例使用beanwapper
获取当前bean依赖的所有组件
结束直接返回
否
doCreateBean()//Spring真正自己创建对象
单实例'、非抽象、非懒加载
否,普通类名
返回null
返回的是wrappedBean可以改变之前创建好的bean
从这个池子singletonsCurrentlyInCreation移除
getBean(beanName)
第一次调用bean后置处理器,调用beanPostProcessor的applyBeanPostProcessorsBeforeInstantiation方法,在bean实例化之前的进行处理, Spring内置的后置处理器中,无相关实现,可使用自定义的后置处理器在这里进行中止bean的创建过程操作
第二次 决定使用哪个处理器
Bean初始化流程-getBean()的详细逻辑
getBean(FACTORY_BEAN_PREFIX + beanName)
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()//初始化之后进行处理
使用默认无参构造器
设置属性Spring把PropertyValues中所有的属性值进行反射赋值
第九次调用后置处理器,判断bean是否有销毁方法(取出第四次调用后置处理器时解析的@PreDestroy方法)有则将bean注册到销毁集合中,用于容器关闭时使用
是,名字加&
遍历获取所有Bean进行创建获取
直接用
遍历所有bean执行SmartInitializingSingleton.afterSingletonsInstantiated()
工厂bean的流程
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()给一个创建代理对象的机会
第一次会返回null
第七次调用后置处理器,ImportAwareBeanPostProcessor处理ImportAware接口,InitDestroyAnnotationBeanPostProcessor处理@PostContrust注解,ApplicationContextAwareProcessor处理一系列Aware接口的回调方法
是否工厂bean
返回PropertyValues
可以当前组件所有属性全部就绪后继续进行增强
SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors()//后置处理器有机会决定当前bean使用哪个构造器
applyBeanPostProcessorsBeforeInitialization
看父工厂有没有这个组件
doGetBean
对象创建
wrapper(功能增强)holder(只用来包装)
第三次,将标识了需要自动装配注解的属性或方法解析出来,包含的注解主要有 @Resource @Autowired @Value @Inject @PostConstruct @PreDestroy
afterSingletonCreation(beanName);//移除当前创建对象池子
InstantiationAwareBeanPostProcessor.postProcessProperties()//处理属性值
0 条评论
下一页