动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

@PostConstruct注解

04-10 21:21 563浏览
举报 T字号
  • 大字
  • 中字
  • 小字

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

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

该注解的方法在整个Bean初始化中的执行顺序:

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

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

package com.bjpowernode.studySpringBoot.util;
     
import com.bjpowernode.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);
0人推荐
共同学习,写下你的评论
0条评论
代码小兵545
程序员代码小兵545

5篇文章贡献19776字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Spring常见面试题

代码小兵92504-17 16:07

Java零基础实战项目——五子棋

代码小兵98804-25 13:57

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

发评论

举报

0/150

取消