看到JSR-250,搜了一下.Spring JSR-250 注释
包含三个注释@PostConstruct
, @PreDestroy
和 @Resource
. 先不看@Resource, 单看前两个.
在使用过程中,曾有过疑问, @PostConstruct
在什么时候会执行.
java本身的顺序 静态代码块 -> 非静态代码块 -> 构造方法 .
那么加了一个@PostConstruct
之后,这个注解修饰的方法会处在什么顺序执行呢.
从网上摘下来一个例子:
有这么一个类, 包含静态代码块, 非静态代码块, 构造方法,
@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"); } }
将这个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>
~~~
在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(); } }
输出如下:
static block
block
construction
PostConstruct
message : Hello World!
PreDestroy
可以看出, @PostConstruct
修饰的方法是在构造函数执行完之后运行的.