文章目录
AutowiredAnnotationBeanPostProcessor
- AutowiredAnnotationBeanPostProcessor完成@AutoWired、@Value和@Inject注解的解析,实现MergedBeanDefinitionPostProcessor接口在bean初始化完成后为BD添加externallyManagedConfigMembers属性
- 实现InstantiationAwareBeanPostProcessor接口根据类型完成bean的属性装填
- 实现PriorityOrdered接口,加载顺序order=Integer.MAX_VALUE-2
继承图
postProcessMergedBeanDefinition
检查当前BeanType中是否有自动装填的注解,有则修改对应BeanDifinition
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
// 根据beanName作为key,解析所有带@AutoWired、@Value和@Inject注解的元数据(分field和method)到injectionMetadataCache缓存中
InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);
// 将对应Member放入BeanDifinition的externallyManagedConfigMembers中
metadata.checkConfigMembers(beanDefinition);
}
postProcessProperties
属性填充
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
// postProcessMergedBeanDefinition中已执行,再次执行直接从缓存获取
InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
try {
metadata.inject(bean, beanName, pvs);
}
···异常
return pvs;
}
inject
根据类型完成属性注入
public void inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
Collection<InjectedElement> checkedElements = this.checkedElements;
Collection<InjectedElement> elementsToIterate =
(checkedElements != null ? checkedElements : this.injectedElements);
// 遍历需要注入的属性
if (!elementsToIterate.isEmpty()) {
for (InjectedElement element : elementsToIterate) {
···日志
// 对应AutowiredFieldElement或AutowiredMethodElement执行
// 最终调用的resolveDependency方法根据类型从BeanFactory中获得对应值
element.inject(target, beanName, pvs);
}
}
}
总结
- 在bean实例创建完成后,搜索bean上是否有注解@AutoWired、@Value和@Inject,存在则为BeanDifinition中externallyManagedConfigMembers属性添加Member(Field或Method)
- 在为bean实例填充属性阶段,根据类型从BeanFactory中获取对应注入到当前实例中
CommonAnnotationBeanPostProcessor
- 继承InitDestroyAnnotationBeanPostProcessor类,完成对@PostConstruct和@PreDestroy注解的解析
- 实现MergedBeanDefinitionPostProcessor接口,添加对应BeanDifinition属性
- 实现InstantiationAwareBeanPostProcessor接口
实现PriorityOrdered接口,加载顺序order=Integer.MAX_VALUE-3,优先级高于AutowiredAnnotationBeanPostProcessor
- 设置初始、销毁注解类型和执行顺序
public CommonAnnotationBeanPostProcessor() {
setOrder(Ordered.LOWEST_PRECEDENCE - 3);
setInitAnnotationType(PostConstruct.class);
setDestroyAnnotationType(PreDestroy.class);
ignoreResourceType("javax.xml.ws.WebServiceContext");
}
- 类实例化完成后配置原始bd信息
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
// 调用InitDestroyAnnotationBeanPostProcessor方法合并externallyManagedInitMethods和externallyManagedDestroyMethods属性到BD中
super.postProcessMergedBeanDefinition(beanDefinition, beanType, beanName);
InjectionMetadata metadata = findResourceMetadata(beanName, beanType, null);
// 合并externallyManagedConfigMembers属性到BD中
metadata.checkConfigMembers(beanDefinition);
}
- 在属性填充时注入对象
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
// 获得@Resource、@EJB、@WebServiceRef
InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs);
try {
metadata.inject(bean, beanName, pvs);
}
catch (Throwable ex) {
throw new BeanCreationException(beanName, "Injection of resource dependencies failed", ex);
}
return pvs;
}
DestructionAwareBeanPostProcessor
销毁bean的处理器
public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {
// 销毁方法调用前处理
void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;
// 判断bean是否需要添加销毁方法
default boolean requiresDestruction(Object bean) {
return true;
}
}
InitDestroyAnnotationBeanPostProcessor
实现MergedBeanDefinitionPostProcessor接口,完成对@PreDestroy和@PostConstruct注解的解析,合并到bd的externallyManagedInitMethods和externallyManagedDestroyMethods属性中
实现DestructionAwareBeanPostProcessor接口,requiresDestruction方法判断当前类是否有@PreDestroy注解,postProcessBeforeDestruction方法完成对@PreDestroy注解的方法的调用
对于@PreDestroy注解的方法在postProcessBeforeInitialization中调用
总结
- 对于@PreDestroy和@PostConstruct注解是通过继承InitDestroyAnnotationBeanPostProcessor来实现,对init-method在BeanPostProcessor中处理,对destroy-method在DisposableBeanAdapter中处理
- 对于@Resource、@EJB和@WebServiceRef处理类似@Autowired处理,会将注解字段或方法合并到externallyManagedConfigMembers属性中
EventListenerMethodProcessor
- 实现BeanFactoryPostProcessor接口,从BeanFactory中获得EventListenerFactory,DefaultEventListenerFactory在初始化应用程序上下文时被注册到BD中
- 实现SmartInitializingSingleton接口,在bean初始化完成后回调执行afterSingletonsInstantiated方法,完成监听器初始化并放入上下文中
@EventListener方法参数只能有一个(通过supportsEventType判断参数类型是否满足条件),如要设置监听多个事件则设置注解的classes属性
在构造函数ApplicationListenerMethodAdapter的resolveDeclaredEventTypes方法中判断参数类型和注解是否满足条件,参数个数大于1抛出异常,注解存在classes属性则解析,不存在则方法参数类型必须存在