spring5.0 源码解析(day04)registerBeanPostProcessors
registerBeanPostProcessors(beanFactory)
该方法主要用于 ** 注册bean的后置处理器,在Bean 创建过程中调用** 这一步的主要功能注册后置处理器
BeanPostProcessor 接口是 Spring 初始化 bean 时对外暴露的扩展点,Spring IoC 容器允许 BeanPostProcessor 在容器初始化 bean 的前后,添加自己的逻辑处理。**在 **registerBeanPostProcessors 方法中是将BeanPostProcessor 注册到容器中统一管理
// 允许自定义修改新bean实例的一个钩子方法
public interface BeanPostProcessor {
// 应用于任何bean之前的给定新bean实例
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
// 应用于任何bean之后的给定新bean实例
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
BeanPostProcessor 实现类和 BeanFactoryPostProcessor 实现类一样,也可以通过实现 PriorityOrdered、Ordered 接口来调整优先级 一次加入到容器中
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
// 注册 BeanPostProcessorChecker,
// 它会在 BeanPostProcessor 实例化期间创建 bean 时记录信息消息,
// 即当 bean 没有资格被所有 BeanPostProcessor 处理时。
// 在 BeanPostProcessor 实例化期间创建一个 bean,即当一个 bean 没有资格被所有 BeanPostProcessor 处理时。
// beanProcessorTargetCount 用于目标计数 这个加法运算
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
// BeanPostProcessorChecker 主要用于 BeanPostProcessor实例化 创建是记录信息
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// Separate between BeanPostProcessors that implement PriorityOrdered,
// Ordered, and the rest. 四个集合 区分实现不同接口的 BeanPostProcessors
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); //优先排序后处理器
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); //内部后处理器
List<String> orderedPostProcessorNames = new ArrayList<>(); //有序的后处理器名称
List<String> nonOrderedPostProcessorNames = new ArrayList<>(); // 非有序后处理器名称
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
// 首先,注册实现PriorityOrdered的BeanPostProcessors.
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// 接下来,注册实现 Ordered 的 BeanPostProcessors.
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
sortPostProcessors(orderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
//现在,注册所有常规 BeanPostProcessors
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// 最后,重新注册所有内部 BeanPostProcessors.
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// 重新注册用于将内部 bean 检测为 ApplicationListeners 的后处理器,
// 将其移动到处理器链的末尾(用于获取代理等).
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
在addBeanPostProcessor() 方法中我们可以看到 如果 BeanPostProcessor 存在 它会被放到尾部,
因为 BeanPostProcessor 调用是采用责任链模式 所以beanPostProcessor也要严格按照顺序存储
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
// Remove from old position, if any
this.beanPostProcessors.remove(beanPostProcessor);
// Add to end of list
this.beanPostProcessors.add(beanPostProcessor);
}
通过 registerBeanPostProcessors 加载到容器中 beanPostProcessors
ApplicationContextAwareProcessor
ApplicationContextAwareProcessor 是在 prepareBeanFactory()时添加进去的
ApplicationContextAwareProcessor实现了BeanPostProcessor接口。并只重新定义了postProcessBeforeInitialization初始化前方法。可以让bean感知到容器的存在
ApplicationListenerDetector
ApplicationListenerDetector也是在 prepareBeanFactory()时添加进去的
他的功能是检查bean 是否是ApplicationListener的子类 如果是则添加到ApplicationListener 中
ConfigurationClassPostProcessor
他是在为主配置类生成代理时传递进去的
它的主要功能是参与BeanFactory的建造,在这个类中,会解析加了@Configuration的配置类,还会解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解。
DestructionAwareBeanPostProcessor
在销毁 Bean 前执行 Bean 所声明的自定义销毁方法,该回调只能应用到单例Bean。
具体实现之一: InitDestroyAnnotationBeanPostProcessor:调用@PreDestroy注解的销毁方法。
PostProcessorRegistrationDelegate
用来注册和执行 BeanPostProcessor 和 BeanFactoryPostProcessors
MergedBeanDefinitionPostProcessor
MergedBeanDefinitionPostProcessor 接口是 BeanPostProcessor 的子接口,用于寻找注入点,所谓注入点其实就是被 Spring 所支持的注解所标记的属性或者方法,在AbstractAutowireCapableBeanFactory 类的 doCreateBean 方法中,Bean 被实例化之后就会调用applyMergedBeanDefinitionPostProcessors 方法。执行该后置处理器的postProcessMergedBeanDefinition 方法。
MergedBeanDefinitionPostProcessor 有许多的子类,其中两个比较重要,分别是 AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor
。
AutowiredAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor实现了 MergedBeanDefinitionPostProcessor,作用是查找bean中的被**@Autowired、@Value** 注解标注的属性与方法,如果有javax.inject.Inject依赖,那么也会查找被@Inject注解标注的属性与方法, 封装成InjectionMetadata对象。
CommonAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor继承了 InitDestroyAnnotationBeanPostProcessor类。而InitDestroyAnnotationBeanPostProcessor类实现了MergedBeanDefinitionPostProcessor。
作用与 AutowiredAnnotationBeanPostProcessor大致相同,只不过针对的是不同的注解。常见的注解有@PostConstruct、@PreDestroy、@Resource。如果有相对应的依赖,也可以使用@WebServiceRef、@EJB,也会被封装成InjectionMetadata对象。