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容器设置了所有属性之后
这时可以用上面提到的三种方法,初始化和析构回调方法。