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

 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

  class="com.shop.Cashier">

 

 

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


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


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

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

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

你可能感兴趣的:(Java框架)