Spring 注解解析

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);
		}
	}
}

总结

  1. 在bean实例创建完成后,搜索bean上是否有注解@AutoWired、@Value和@Inject,存在则为BeanDifinition中externallyManagedConfigMembers属性添加Member(Field或Method)
  2. 在为bean实例填充属性阶段,根据类型从BeanFactory中获取对应注入到当前实例中

CommonAnnotationBeanPostProcessor

  • 继承InitDestroyAnnotationBeanPostProcessor类,完成对@PostConstruct和@PreDestroy注解的解析
  • 实现MergedBeanDefinitionPostProcessor接口,添加对应BeanDifinition属性
  • 实现InstantiationAwareBeanPostProcessor接口
    实现PriorityOrdered接口,加载顺序order=Integer.MAX_VALUE-3,优先级高于AutowiredAnnotationBeanPostProcessor
  1. 设置初始、销毁注解类型和执行顺序
public CommonAnnotationBeanPostProcessor() {
	setOrder(Ordered.LOWEST_PRECEDENCE - 3);
	setInitAnnotationType(PostConstruct.class);
	setDestroyAnnotationType(PreDestroy.class);
	ignoreResourceType("javax.xml.ws.WebServiceContext");
}
  1. 类实例化完成后配置原始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);
}
  1. 在属性填充时注入对象
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中调用

总结

  1. 对于@PreDestroy和@PostConstruct注解是通过继承InitDestroyAnnotationBeanPostProcessor来实现,对init-method在BeanPostProcessor中处理,对destroy-method在DisposableBeanAdapter中处理
  2. 对于@Resource、@EJB和@WebServiceRef处理类似@Autowired处理,会将注解字段或方法合并到externallyManagedConfigMembers属性中

EventListenerMethodProcessor

  • 实现BeanFactoryPostProcessor接口,从BeanFactory中获得EventListenerFactory,DefaultEventListenerFactory在初始化应用程序上下文时被注册到BD中
  • 实现SmartInitializingSingleton接口,在bean初始化完成后回调执行afterSingletonsInstantiated方法,完成监听器初始化并放入上下文中

@EventListener方法参数只能有一个(通过supportsEventType判断参数类型是否满足条件),如要设置监听多个事件则设置注解的classes属性
在构造函数ApplicationListenerMethodAdapter的resolveDeclaredEventTypes方法中判断参数类型和注解是否满足条件,参数个数大于1抛出异常,注解存在classes属性则解析,不存在则方法参数类型必须存在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值