文章目录
Bean的实例化-注解支持
注解支持 注解的实现过程,其实就是Spring Bean的自动装配过程,存在于Srping bean的生命周期中,Spirng 中有三种bean的装配机制:
|
注解处理的入口
Spring初始化过程中,调用注解处理的几个主要埋点
├─ refresh
│ ├─ prepareRefresh
│ ├─ obtainFreshBeanFactory XML文件解析,component-scan属性解析
│ ├─ prepareBeanFactory
│ ├─ postProcessBeanFactory
│ ├─ invokeBeanFactoryPostProcessors
│ ├─ registerBeanPostProcessors 实例化注解处理器
│ ├─ initMessageSource
│ ├─ initApplicationEventMulticaster
│ ├─ onRefresh
│ ├─ registerListeners
│ ├─ finishBeanFactoryInitialization
│ │ ├─ getObjectForBeanInstance
│ │ ├─ getBean
│ │ │ ├─ createBean
│ │ │ │ ├─ doCreateBean
│ │ │ │ │ ├─ createBeanInstance
│ │ │ │ │ │ ├─ determineConstructorsFromBeanPostProcessors 解析构造函数是否有@Autowired
│ │ │ │ │ ├─ applyMergedBeanDefinitionPostProcessors 注解的搜集和装配过程
│ │ │ │ │ ├─ earlySingletonExposure
│ │ │ │ │ ├─ addSingletonFactory
│ │ │ │ │ ├─ populateBean
│ │ │ │ │ │ ├─ postProcessProperties 根据收集到的注解进行反射调用
│ │ │ │ │ │ │ ├─ AutowiredFieldElement.inject 解析有@Autowired注解域的注入
│ │ │ │ │ │ │ ├─ AutowiredMethodElement.inject 解析有@Autowired注解方法的注入
│ │ │ │ │ ├─ initializeBean
│ │ │ │ │ │ ├─ applyBeanPostProcessorsBeforeInitialization 解析处理@PostConstruct
│ │ │ │ │ │ ├─ invokeInitMethods
│ │ │ │ │ │ ├─ applyBeanPostProcessorsAfterInitialization AOP的入口
│ │ │ ├─ afterSingletonCreation
│ │ │ └─ addSingleton
注解的装配与收集
装配过程 1、根据xml文件 context:component-scan标签中的类路径或者@ComponentScan注解中的类路径进行扫描解析,将包含@Component和元注解为@Component的注解@Controller、@Service、@Repository还有支持 Java EE 6的@link javax.annotation.ManagedBean和 JSR-330的 @link javax.inject.Named的bean封装到BeanDefinition对象后,最后注册到 BeanFactory中。
2、注册注解后置处理器,主要由BeanPostProcessor来负责解析,具体包括:
|
注解后置处理器的收集过程 @Autowired 和 @Resource 注解的收集过程基本一致,流程如下:
|
注解的装配与收集
CommonAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor支持了@PostConstruct、@PreDestroy、@Resource等注解的解析工作,但是真正对@PostConstruct、@PreDestroy两个注解的解析是由其父类InitDestroyAnnotationBeanPostProcessor来完成的
// CommonAnnotationBeanPostProcessor的构造函数,支持了@PostConstruct、@PreDestroy
public CommonAnnotationBeanPostProcessor() {
setOrder(Ordered.LOWEST_PRECEDENCE - 3);
setInitAnnotationType(PostConstruct.class);
setDestroyAnnotationType(PreDestroy.class);
ignoreResourceType("javax.xml.ws.WebServiceContext");
}
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
//扫描@PostConstruct @PreDestroy
super.postProcessMergedBeanDefinition(beanDefinition, beanType, beanName);
//扫描@Resource,扫描属性和方法上面是否有@Resource注解,如果有则收集起来封装成对象
InjectionMetadata metadata = findResourceMetadata(beanName, beanType, null);
metadata.checkConfigMembers(beanDefinition);
}
AutowiredAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor后置处理器,主要处理@Autowired的解析
public AutowiredAnnotationBeanPostProcessor() {
this.autowiredAnnotationTypes.add(Autowired.class);
this.autowiredAnnotationTypes.add(Value.class);
try {
this.autowiredAnnotationTypes.add((Class<? extends Annotation>)
ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));
logger.trace("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");
}
catch (ClassNotFoundException ex) {
// JSR-330 API not available - simply skip.
}
}
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
// 扫描@Autowired,扫描属性和方法上面是否有@Autowired注解,如果有则收集起来封装成对象
InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);
metadata.checkConfigMembers(beanDefinition);
}