zoukankan      html  css  js  c++  java
  • @PostConstruct注解详解

    @PostConstruct注解是Java自己的注解。

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

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

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

    应用:在静态方法中调用依赖注入的Bean中的方法。可作为一些数据的常规化加载,比如数据字典之类的。

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

    站在巨人肩膀上摘苹果

    https://blog.csdn.net/qq360694660/article/details/82877222

  • 相关阅读:
    1.表单标签
    07.Ajax.post
    06.Ajax.get
    05.Ajax.get
    04.Ajax-get.html
    03.post.file
    nodejs-7.2. CURD数据管理系统小栗子
    nodejs-7.1. mongoose模块
    JS 无缝轮播图1-节点操作
    JS 放大镜特效
  • 原文地址:https://www.cnblogs.com/eternityz/p/15330055.html
Copyright © 2011-2022 走看看