Bean 的实例化之 @PostConstruct、@PreDestroy、@Resource
├─finishBeanFactoryInitialization(beanFactory); Spring 核心方法中的
│ ├─beanFactory.preInstantiateSingletons();
│ │ ├─getBean(beanName);
│ │ │ ├─doGetBean(name, null, null, false);
│ │ │ │ ├─这里完成了对所有 MergedBeanDefinitionPostProcessor 实现类的调用。
│ │ │ │ ├─如:CommonAnnotationBeanPostProcessor(@PostConstruct、@PreDestroy、@Resource)
│ │ │ │ ├─如:AutowiredAnnotationBeanPostProcessor(@Autowired, @Value)
│ │ │ │ ├─applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
│ │ │ │ │ ├─processor.postProcessMergedBeanDefinition(mbd, beanType, beanName);
CommonAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor 支持了@PostConstruct、@PreDestroy、@Resource 等注解的扫描解析工作。
但是真正对@PostConstruct、@PreDestroy 两个注解的解析是由其父类 InitDestroyAnnotationBeanPostProcessor 来完成的。
- 收集注解 @Resource @PostConstruct @PreDestory
- 并完成 @Resource 的依赖注入(因为实现了 InstantiationAwareBeanPostProcessor)。
- 以及完成 Bean 实例化和 IOC 依赖注入完以后的调用(@PostConstruct)
java
public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor
implements InstantiationAwareBeanPostProcessor, BeanFactoryAware, Serializable {
// 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);
}
}