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

本文介绍了Spring IOC容器如何管理Bean的生命周期,包括构造、属性注入、初始化回调、正常运行及析构回调的步骤。文章提到了三种定义回调方法的方式:实现InitializingBean和DisposableBean接口、使用init-method和destroy-method属性、使用@PostConstruct和@PreDestroy注解。并通过一个Cashier类的例子说明了初始化的重要性,解释了为什么不能在构造函数中初始化,而应在所有属性设置完成后进行。

 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容器设置了所有属性之后

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

Java是一种广泛使用的面向对象编程语言,具有强大的跨平台能力、安全性、可移植性高度的抽象性。对于Java程序设计的知识点整理,我会提供一个简要概述关键部分的介绍,但请注意,由于字数限制,这里无法提供完整的2000字详细内容。以下是Java程序设计中的一些核心知识点: 1. **Java概述**: - Java的历史发展 - Java的特性优势(如平台无关性、垃圾回收机制) - Java的核心API类库 2. **Java语法基础**: - 数据类型变量 - 运算符表达式 - 控制结(if-else、switch、循环等) - 数组集合框架 3. **面向对象编程**: - 抽象类接口的区别 4. **造函数器**: - 造函数的作用生命周期 - 初始化器的使用 5. **异常处理**: - 异常的概念分类 - try-catch-finally语句结 - 自定义异常抛出异常 6. **输入输出流**: - 字符流(`System.out.println()`) - 文件I/O操作 - 输入/输出流的缓冲区关闭资源 7. **类加载器包**: - 类加载过程 - 包的作用命名规则 8. **多线程**: - Thread类Runnable接口 - 互斥量、信号量条件变量 - 线程池并发工具类 9. **集合框架**: - 核心类(List, Set, Map) - 集合接口(Iterable, Iterator) - 泛型集合容器的使用 10. **IO流网络编程**: - Socket编程 - ServerSocketClientSocket - 套接字工厂NIO(非阻塞I/O) 11. **并发编程工具**: - CompletableFuture - ExecutorServiceThreadFactory - FutureCallable 12. **JVM内存管理**: - 堆栈的区别 - Garbage Collection(垃圾回收)机制 13. **数据库访问**: - JDBC连接数据库 - ORM框架(Hibernate, MyBatis) 14. **Spring框架**: - IoCAOP概念 - Bean容器配置文件 15. **测试驱动开发(TDD)**: - JUnit单元测试 - Mockito模拟对象 16. **Spring Boot**: - 简化Java应用的初始配置 - RESTful API的创建 相关问题: 1. Java的三大特性是什么? 2. 你能解释一下Java中的封装吗? 3. JUnit在单元测试中的作用是什么? 4. Spring框架如何简化开发流程? 如果想深入了解每个知识点,你可以查阅相关的教程书籍、在线文档或视频课程进行学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值