美文网首页
@PostConstruct注解

@PostConstruct注解

作者: b335eb9201c3 | 来源:发表于2021-01-12 17:14 被阅读0次

    @PostConstruct基本:

    @PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。

    Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

    通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:

    Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

    应用:在静态方法中调用依赖注入的Bean中的方法。

    package com.example.studySpringBoot.util;
     
    import com.example.studySpringBoot.service.MyMethorClassService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
     
    import javax.annotation.PostConstruct;
     
    @Component
    public class MyUtils {
     
        private static MyUtils          staticInstance = new MyUtils();
     
        @Autowired
        private MyMethorClassService    myService;
     
        @PostConstruct
        public void init(){
            staticInstance.myService = myService;
        }
     
        public static Integer invokeBean(){
            return staticInstance.myService.add(10,20);
        }
    }
    

    那么Java提供的@PostConstruct注解,Spring是如何实现的呢?

    需要先学习下BeanPostProcessor这个接口:

    
    public interface BeanPostProcessor {
     
        /**
         * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean
         * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
         * or a custom init-method). The bean will already be populated with property values.
         * The returned bean instance may be a wrapper around the original.
         * 
         * 任何Bean实例化,并且Bean已经populated(填充属性) 就会回调这个方法
         *
         */
        Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
     
        /**
         * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean
         * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
         * or a custom init-method). The bean will already be populated with property values.
         * The returned bean instance may be a wrapper around the original.
         *
         * 任何Bean实例化,并且Bean已经populated(填充属性) 就会回调这个方法
         *
         */
        Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
    
    那Spring初始化是那里回调这些方法呢?
    AbstractApplicationContext.finishBeanFactoryInitialization(...);
        beanFactory.preInstantiateSingletons();
           DefaultListableBeanFactory.getBean(beanName);
              AbstractBeanFactory.doGetBean();
                AbstractAutowireCapableBeanFactory.createBean(....)
                    populateBean(beanName, mbd, instanceWrapper);
                    initializeBean(...)
                     //调用BeanPostProcessor.postProcessBeforeInitialization()方法
                      applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
                     //调用BeanPostProcessor.postProcessBeforeInitialization()方法
                      applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    

    BeanPostProcessor有个实现类CommonAnnotationBeanPostProcessor,就是专门处理@PostConstruct @PreDestroy注解。

    CommonAnnotationBeanPostProcessor的父类InitDestroyAnnotationBeanPostProcessor()
     InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization()
        InitDestroyAnnotationBeanPostProcessor.findLifecycleMetadata()
            // 组装生命周期元数据
            InitDestroyAnnotationBeanPostProcessor.buildLifecycleMetadata()
                // 查找@PostConstruct注释的方法
                InitDestroyAnnotationBeanPostProcessor.initAnnotationType
                // 查找@PreDestroy注释方法
                InitDestroyAnnotationBeanPostProcessor.destroyAnnotationType
     // 反射调用          
     metadata.invokeInitMethods(bean, beanName);
    

    相关文章

      网友评论

          本文标题:@PostConstruct注解

          本文链接:https://www.haomeiwen.com/subject/yrjeaktx.html