今天讲下在项目中用@PostConstruct,@PreDestory的知识点。
=================================
从JavaEE5开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct与@PreDestory,这两个注解用来修饰一个非静态的void()方法,而且这个方法不能抛出异常声明。使用注解修饰方法的时候可以写在方法的前面,也可以写在返回类型或者void的前面。
@PostConstruct
public void someMethod(){....}
public @PreDestroy void anothedMethod(){....}
=================================
那么首先看下@PostConstruct源码注释
其实从依赖注入的字面意思就可以知道,要将对象a注入到对象b,那么首先就必须得生成对象a与对象b,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发生在A的构造方法执行完之后的。
如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
================================
实例说明它有什么作用
比如说我有一种情况,在我的servlet初始化加载之前我想处理一些东西,像加载缓存等等。
================================
PostConstruct注释规则
1. 除了拦截器这个特殊情况以外,其他情况都不允许有参数,否则spring框架会报IllegalStateException;而且返回值要是void,但实际也可以有返回值,至少不会报错,只会忽略
2. 方法随便你用什么权限来修饰,public、protected、private都可以,反正功能是由反射来实现
3. 方法不可以是static的,但可以是final的
所以,综上所述,在spring项目中,在一个bean的初始化过程中,方法执行先后顺序为
Constructor(构造方法)>@Autowired(依赖入)>@PostConstruct(注释的方法),先执行完构造方法,再注入依赖,最后执行初始化操作,所以这个注解就避免了一些需要在构造方法里使用依赖组件的问题。
被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行。
=================================
下面用代码看下生命周期中@PostConstruct和@PreDestory运行顺序
==============================
被注解的Servlet生命周期
需要注意的是,注解会多多少少地影响到服务器的启动速度。服务器在启动时候会遍历Web 应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的所有jar文件,以检查哪些类使用了注解。如果应用程序中没有使用任何注解,可以在Web.xml中设置的metadata-complete属性为true.(支持@PostConstruct和 @PreDestroy的服务器需要支持Servlet2.5规范。Tomcat5.x仅支持Servlet2.4规范。)
=================================
记录学习,每天进步一点点的橘子大王。