zoukankan      html  css  js  c++  java
  • Spring@PostConstruct注解和构造方法的调用顺序

    先看下@PostConstruct的注解

     * The PostConstruct annotation is used on a method that needs to be executed
     * after dependency injection is done to perform any initialization. This
     * method MUST be invoked before the class is put into service. This
     * annotation MUST be supported on all classes that support dependency
     * injection. The method annotated with PostConstruct MUST be invoked even
     * if the class does not request any resources to be injected. Only one
     * method can be annotated with this annotation. The method on which the
     * PostConstruct annotation is applied MUST fulfill all of the following
     * criteria -

    自己翻译一下,意思是:

    PostConstruct注解用于方法上,该方法在初始化的依赖注入操作之后被执行。这个方法必须在class被放到service之后被执行,这个注解所在的类必须支持依赖注入。

    父类class,被@component注解修饰,说明会被spring扫描并创建。在默认构造方法里加上输出打印,init方法被@PostConstruct修饰

     1 @Component
     2 public class ParentBean implements InitializingBean{
     3     
     4     public ParentBean() {
     5         System.out.println("ParentBean construct");
     6     }
     7     
     8     @PostConstruct
     9     public void init(){
    10         System.out.println("ParentBean init");
    11     }
    12 
    13     public void afterPropertiesSet() throws Exception {
    14         System.out.println("ParentBean afterPropertiesSet");
    15     }
    16 
    17 }

    子类class,也被 @component注解修饰,其余配置和父类class一样

     1 @Component
     2 public class SonBean extends ParentBean{
     3     public SonBean() {
     4         System.out.println("SonBean construct");
     5     }
     6     
     7     @PostConstruct
     8     public void init(){
     9         System.out.println("SonBean init");
    10     }
    11     @Override
    12     public void afterPropertiesSet() throws Exception {
    13         System.out.println("SonBean afterPropertiesSet");
    14     }
    15     
    16 }

    然后我们使用maven命令 jetty:run,控制台输出如下:

    [INFO] Initializing Spring root WebApplicationContext
    ParentBean construct
    ParentBean init
    ParentBean afterPropertiesSet
    ParentBean construct
    SonBean construct
    SonBean init
    SonBean afterPropertiesSet
    [INFO] Set web app root system property: 'webapp.root' = [J:androidworkspacecomsrcmainwebapp]
    [INFO] Initializing log4j from [classpath:log4j.properties]
    [INFO] Started SelectChannelConnector@0.0.0.0:8088
    [INFO] Started Jetty Server
    [INFO] Starting scanner at interval of 3 seconds.

    可以看出优先执行依然是构造方法,这个是java的语言决定的,毕竟spring只是建立在java之上的框架。然后才是被PostConstruct修饰的方法,要注意的是这个方法在对象的初始化和依赖都完成之后才会执行,所以不必担心执行这个方法的时候有个别成员属性没有被初始化为null的情况发生。在init方法之后执行的才是afterPropertiesSet方法,这个方法必须实现InitializingBean接口,这个接口很多spring的bean都实现了他,从他的方法名就能看出在属性都被设置了之后执行,也属于springbean初始化方法。

    其实spring提供了很多接口以供开发者在bean初始化后调用,可以在官网上查阅相关文档。

    参考:https://my.oschina.net/wwwd/blog/810530

  • 相关阅读:
    计算机网络为什么是这样样子?
    MySQL技术内幕 InnoDB存储引擎 B+树索引的使用 笔记
    后端性能-batch 化的想法
    稳定高效的服务来自于稳定而合理的数据结构
    gRPC 学习了解记录
    Go 进阶训练营 Week02: error 错误处理
    生活小感受
    Nginx 499 排查到docker 中一个进程一直在空转
    方法论和原理总结
    Debug
  • 原文地址:https://www.cnblogs.com/warehouse/p/6846434.html
Copyright © 2011-2022 走看看