Skip to content

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