《Spring Recipes》第二章笔记:Customizing Bean Initiali...

《Spring Recipes》第二章笔记:Customizing Bean Initialization and Destruction


问题

用户想要指定Spring容器在创建完一个bean后,立刻调用一个PostConstruct方法;或者在销毁一个bean之前,必须调用一个PreDestroy方法。

解决方案

(1)实现InitializingBean或者DisposableBean接口,并实现的afterPropertiesSet()和destroy()方法。
(2)在<bean>元素的init-method或destroy-method属性指定方法名称。
(3)在PostConstruct方法方法上添加@PostConstruct注解。在PreDestroy方法上添加@PreDestroy注解。

实现InitializingBean或者DisposableBean接口

bean:
public class Cashier implements InitializingBean, DisposableBean {
... ...
  public void afterPropertiesSet() throws Exception {
    openFile();
  }
  
  public void destroy() throws Exception {
    closeFile();
  }
}


在<bean>元素的init-method或destroy-method属性指定方法名称

配置文件:
<bean id="cashier1" class="com.apress.springrecipes.shop.Cashier"
init-method="openFile" destroy-method="closeFile">
    <property name="name" value="cashier1" />
    <property name="path" value="c:/cashier" />
</bean>


使用注解

bean:
public class Cashier {
...
  @PostConstruct
  public void openFile() throws IOException {
    File logFile = new File(path, name + ".txt");
    writer = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream(logFile, true)));
  }

  @PreDestroy
  public void closeFile() throws IOException {
    writer.close();
  }
}

注意:
(1)@PostConstruct和@PreDestroy注解是JSR-250注解,所以需要添加JSR-250的依赖。
(2)必须在容器中注册CommonAnnotationBeanPostProcessor实例,Spring容器才能出来这些注解。
注册方式:
a.直接注册实例:
<beans ...>
...
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

<bean id="cashier1" class="com.apress.springrecipes.shop.Cashier">
<property name="name" value="cashier1" />
<property name="path" value="c:/cashier" />
</bean>
</beans>

b.添加<context:annotation-config />配置:
<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.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config />
...
</beans>


你可能感兴趣的:(spring)