关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:
第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
第二种是:通过 在xml中定义init-method 和 destory-method方法
第三种是: 通过bean实现InitializingBean和 DisposableBean接口
下面演示通过 @PostConstruct 和 @PreDestory
1:定义相关的实现类:
[java] view plain copy
- package com.myapp.core.annotation.init;
-
- import javax.annotation.PostConstruct;
- import javax.annotation.PreDestroy;
-
- public class PersonService {
-
- private String message;
-
- public String getMessage() {
- return message;
- }
-
- public void setMessage(String message) {
- this.message = message;
- }
-
- @PostConstruct
- public void init(){
- System.out.println("I'm init method using @PostConstrut...."+message);
- }
-
- @PreDestroy
- public void dostory(){
- System.out.println("I'm destory method using @PreDestroy....."+message);
- }
-
- }
2:定义相关的配置文件:
[html] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.1.xsd">
-
-
-
- <context:annotation-config />
-
- <bean id="personService" class="com.myapp.core.annotation.init.PersonService">
- <property name="message" value="123"></property>
- </bean>
-
- </beans>
其中<context:annotation-config />告诉spring 容器采用注解配置:扫描注解配置;
测试类:
[java] view plain copy
- package com.myapp.core.annotation.init;
-
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
-
- public class MainTest {
-
- public static void main(String[] args) {
-
- ApplicationContext context = new ClassPathXmlApplicationContext("resource/annotation.xml");
-
- PersonService personService = (PersonService)context.getBean("personService");
-
- personService.dostory();
- }
-
- }
测试结果:
I'm init method using @PostConstrut....123
I'm destory method using @PreDestroy.....123
其中也可以通过申明加载org.springframework.context.annotation.CommonAnnotationBeanPostProcessor
类来告诉Spring容器采用的 常用 注解配置的方式:
只需要修改配置文件为:
[html] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.1.xsd">
-
-
-
-
-
-
- <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
- <bean id="personService" class="com.myapp.core.annotation.init.PersonService">
- <property name="message" value="123"></property>
- </bean>
-
-
-
- </beans>
同样可以得到以上测试的输出结果。
转载另一篇
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:
第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
第二种是:通过 在xml中定义init-method 和 destory-method方法
第三种是: 通过bean实现InitializingBean和 DisposableBean接口
1:定义相应类实现InitializingBean ,DisposableBean 接口
[java] view plain copy
- package com.myapp.core.annotation.init;
-
- import javax.annotation.PostConstruct;
- import javax.annotation.PreDestroy;
-
- import org.springframework.beans.factory.DisposableBean;
- import org.springframework.beans.factory.InitializingBean;
-
- public class PersonService implements InitializingBean,DisposableBean{
-
- private String message;
-
- public String getMessage() {
- return message;
- }
-
- public void setMessage(String message) {
- this.message = message;
- }
-
- @Override
- public void destroy() throws Exception {
-
- System.out.println("I'm init method using implements InitializingBean interface...."+message);
-
- }
-
- @Override
- public void afterPropertiesSet() throws Exception {
-
- System.out.println("I'm init method using implements DisposableBean interface...."+message);
-
- }
-
-
- }
2:定义相应的配置文件:
[java] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http:
- http:
- http:
- http:
-
- <!-- <context:component-scan base-package="com.myapp.core.jsr330"/> -->
-
- <!-- <context:annotation-config /> -->
-
-
- <!-- <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
- <bean id="personService" class="com.myapp.core.annotation.init.PersonService">
- <property name="message" value="123"></property>
- </bean>
- -->
-
- <bean id="personService" class="com.myapp.core.annotation.init.PersonService">
- <property name="message" value="123"></property>
- </bean>
-
- </beans>
3:测试类:
[java] view plain copy
- package com.myapp.core.annotation.init;
-
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.AbstractApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
-
- public class MainTest {
-
- public static void main(String[] args) {
-
- AbstractApplicationContext context = new ClassPathXmlApplicationContext("resource/annotation.xml");
-
- PersonService personService = (PersonService)context.getBean("personService");
-
- context.registerShutdownHook();
- }
-
- }
4:输出测试结果:
[plain] view plain copy
- I'm init method using implements DisposableBean interface....123
- 三月 16, 2013 5:06:34 下午 org.springframework.context.support.AbstractApplicationContext doClose
- INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@205756: startup date [Sat Mar 16 17:06:30 CST 2013]; root of context hierarchy
- I'm init method using implements InitializingBean interface....123
转载另一篇
从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法 。写法有如下两种方式:
@PostConstruct
Public void someMethod() {}
或者
public @PostConstruct void someMethod(){}
被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行
被注解的Servlet生命周期
需要注意的是,注解会多多少少地影响到服务器的启动速度。服务器在启动时候会遍历Web 应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的所有jar文件,以检查哪些类使用了注解。如果应用程序中没有 使用任何注解,可以在Web.xml中设置的metadata-complete属性为true.(支持@PostConstruct和 @PreDestroy的服务器需要支持Servlet2.5规范。Tomcat5.x仅支持Servlet2.4规范。)
我现在要说的是用实例说明它有什么作用。
比如说我有一种情况,在我的servlet初始化加载之前我想处理一些东西,像加载缓存等等。
怎么做。@PostConstruct就派上用场了。那为什么这玩意用的不多呢,这是因为如果初始化之前我们要加载或处理某些玩意完全可以在构造器初始化时就处理了,但这种方法需要自己重写构造器。好吧。直接上代码看看具体用它的时候怎么做的。
[java] view plain copy print?
- package com.whaty.products.whatysns.web.info;
-
- import javax.annotation.PostConstruct;
- import javax.annotation.Resource;
-
- import org.springframework.stereotype.Service;
- import org.springframework.util.Assert;
-
- import com.whaty.framework.cache.core.model.Cache;
- import com.whaty.framework.cache.core.service.CacheService;
- import com.whaty.framework.cache.entitycache.service.EntityCacheHelper;
- import com.whaty.framework.cache.entitycache.service.IEntityDaoAdapter;
-
-
-
-
-
-
- @Service("AjaxCacheableService")
- public class AjaxCacheableService{
-
- @Resource(name="cacheService")
- protected CacheService cacheService;
-
- protected boolean useReadWriteEntityDao = false;
- protected boolean useCache = true;
- protected int entityCacheMaxSize = 1000;
- protected int entityCacheMaxLiveSeconds = 3600;
- protected Cache entityCache;
-
-
-
-
-
- @PostConstruct
- public void init() {
- Assert.notNull(cacheService, "cacheService must be set!");
- getCache();
- }
-
-
-
-
-
- protected Cache getCache() {
- if (entityCache == null) {
- entityCache = cacheService.addCache(this.getClass().getName(),entityCacheMaxLiveSeconds);
- }
- return entityCache;
- }
-
-
-
-
-
-
- public Object getCache(String id) {
- String strid = String.valueOf(id);
- Object o = entityCache.get(strid);
- return o;
- }
-
- public Object putCache(int tTLSeconds,String cacheId,Object value) {
- String strid = String.valueOf(cacheId);
- Object o = entityCache.get(strid);
- if (o != null) {
- return o;
- } else {
- entityCache.put(strid, value, tTLSeconds);
- return value;
- }
- }
-
- }