使用@PostConstruct修饰的方法执行顺序

看到JSR-250,搜了一下.Spring JSR-250 注释
包含三个注释@PostConstruct, @PreDestroy@Resource. 先不看@Resource, 单看前两个.
在使用过程中,曾有过疑问, @PostConstruct在什么时候会执行.
java本身的顺序 静态代码块 -> 非静态代码块 -> 构造方法 .
那么加了一个@PostConstruct之后,这个注解修饰的方法会处在什么顺序执行呢.
从网上摘下来一个例子:

  1. 有这么一个类, 包含静态代码块, 非静态代码块, 构造方法, @PostConstruct修饰的方法, @PreDestroy修饰的方法

    public class Hello {
    
     private String message ;
    
     public String getMessage() {
         System.out.println("message : " + message);
         return message;
     }
    
     public void setMessage(String message) {
         this.message = message;
     }
    
     static {
         System.out.println("static block");
     }
    
     {
         System.out.println("block");
     }
    
     public Hello(){
         System.out.println("construction");
     }
    
     @PostConstruct
     public void init(){
         System.out.println("PostConstruct");
     }
    
     @PreDestroy
     public void destroy(){
         System.out.println("PreDestroy");
     }
    }
  2. 将这个bean加入到spring ioc容器中.

    <?xml version="1.0" encoding="UTF-8"?>
    

<context:annotation-config/>

<bean id="hello" class="com.example.jsr250.Hello">
    <property name="message" value="Hello World!"/>
</bean>
~~~
  1. 在main方法中获取这个bean

    public class MainApp {
     public static void main(String[] args) {
         AbstractApplicationContext abstractContext = new ClassPathXmlApplicationContext("Beans.xml");
         Hello obj = (Hello) abstractContext.getBean("hello");
         obj.getMessage();
         abstractContext.registerShutdownHook();
     }
    }
  2. 输出如下:

    static block
    block
    construction
    PostConstruct
    message : Hello World!
    PreDestroy


可以看出, @PostConstruct修饰的方法是在构造函数执行完之后运行的.


   转载规则


《使用@PostConstruct修饰的方法执行顺序》 echi1995 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
在spring中获取applicationContext. 在spring中获取applicationContext.
以前想要获取applicationContext, 在网上搜索后也很麻烦,不好用.今天在看spring文档时, 发现文档上写了一种很简单的获取方法(Spring Framework Version: 4.3.21.RELEASE): 您
下一篇 
初见cglib 初见cglib
今天在看spring文档的时候看到了cglib代理. 出于好奇,就去搜索了一下.深入理解CGLIB动态代理机制并没有很深入的去了解这个代理机制,只是简单的看了一下怎么用. 毕竟现在主要还是学习spring文档. 之前也看过java中的动
  目录