spring之 自定义Bean初始化和析构

时间:2022-06-07 20:35:29

 springIOC 容易负责管理Bean的生命周期,允许你在它们的生命期特定时点执行自定义任务,你的任务应该封装在回调方法中,由spring IoC容器在核实的时候调用

 下面的列表展示了SpringIoC容器管理Bean周期的步骤

 ① 构造程序或者工厂方法创建Bean实例

 ② 向Bean属性设置值和Bean引用

 ③ 调用初始化回调方法

 ④ Bean就绪

 ⑤ 容器关闭时,调用析构回调方法

Spring由三种识别初始化和析构回调方法的方式,

第一,你的Bean可以实现InitializingBean 和 DisposableBean生命周期接口,并且实现用于初始化和析构的afterPropertiesSet() 和destroy()方法

第二,你可以在Bean声明中设置init-method和destroy-method属性,指定回调方法名称

第三,可以用声明周期注解@PostConstruct和@PreDestroy注解初始化和析构回调方法

 

工作原理

先来考虑一个涉及结账功能的示例

下面的Cashier类可以用于购物车中产品的结账,

public class Cashier {
private String name;
private String path;
private BufferedWriter writer;

public void setName(String name) {
this.name = name;
}

public void setPath(String path) {
this.path = path;
}

public void openFile() throws IOException{
File logFile = new File(path,name+".txt");
writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(logFile,true)));
}
public void checkout(ShoppingCart cart) throws IOException{
double total = 0 ;
for(Product product : cart.getItems()){
total+=product.getPrice();
}
writer.write(new Date()+"\t"+total+"\r\n");
writer.flush();
}
public void closeFile() throws IOException{
writer.close();
}

}

然后你在Ioc容器中声明一个名为cashier的收银员Bean

<bean id ="cashier1 "

  class="com.shop.Cashier">

  <property name="name" value="cashier1"/>

  <property name="path" value="c:/cashier"/>

</bean>

但是,在main类中,如果你试图用这个收银员为购物车结账,将出现NullPointerException异常,原因是没有调用openFile方法进行初始化


你应该在哪里调用openFile初始化呢,在java中,初始化任务应该在构造方法中执行,但是这里不可以,你必须在设置了name和path方法之后才可以确定打开哪个文件


调用默认构造程序时,这些属性还没有设置,

所以,调用这些的最佳时机是在spring IoC容器设置了所有属性之后

这时可以用上面提到的三种方法,初始化和析构回调方法。