Day2 bean生命周期
bean生命周期函数
我们可以给bean定义初始化函数和销毁函数,Spring在启动和关闭时会自动调用它们。
基于xml
用法:
<bean id="connector" class="com.bailiban.day2.lifecycle.MyConnector"
init-method="init" destroy-method="destroy" />
- init-method:设置初始化方法;
- destroy-method:设置销毁方法;
示例:
/**
* xml配置:
* init-method="init" destroy-method="destroy"
*/
public class MyConnector {
public MyConnector() {
System.out.println("MyConnector: 调用构造函数...");
}
public void init() {
System.out.println("MyConnector: 调用初始化函数,创建连接...");
}
public Object getConnection() {
System.out.println("获取连接...");
return null;
}
public void destroy() {
System.out.println("MyConnector: 调用销毁函,关闭连接,清除资源...");
}
}
测试:
/**
* 在xml文件中配置初始化和销毁方法
* init-method="init" destroy-method="destroy"
*/
static void xmlTest() {
// 在初始化Spring容器的时候,会创建MyConnector类
// 并调用其构造函数和初始化函数
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"com/bailiban/day2/lifecycle/lifecycle.xml");
// 获取MyConnector对象,并调用相关方法。
// 注意:MyConnector对象不是在getBean方法中创建的,而是在Spring初始化时已被创建
context.getBean(MyConnector.class).getConnection();
// 关闭Spring容器,bean的销毁方法会被执行
context.close();
}
运行结果:
MyConnector: 调用构造函数...
MyConnector: 调用初始化函数,创建连接...
获取连接...
MyConnector: 调用销毁函,关闭连接,清除资源...
基于接口
用法:
/**
* 通过实现InitializingBean接口,创建初始化烦方法
* 实现DisposableBean接口,创建销毁方法
*/
public class MyConnector2 implements InitializingBean, DisposableBean {
public MyConnector2() {
System.out.println("MyConnector: 调用构造函数...");
}
public Object getConnection() {
System.out.println("获取连接...");
return null;
}
@Override
public void destroy() {
System.out.println("MyConnector: 调用销毁函,关闭连接,清除资源...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("MyConnector: 调用初始化函数,创建连接...");
}
}
- 继承InitializingBean接口:通过重写afterPropertiesSet方法,设置初始化方法;
- 继承DisposableBean接口:通过重写destroy方法,设置销毁方法;
测试:
/**
* 通过实现InitializingBean接口,创建初始化方法
* 实现DisposableBean接口,创建销毁方法
*/
static void interfaceTest() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"com/bailiban/day2/lifecycle/lifecycle.xml");
context.getBean(MyConnector2.class).getConnection();
context.close();
}
运行结果:
MyConnector: 调用构造函数...
MyConnector: 调用初始化函数,创建连接...
获取连接...
MyConnector: 调用销毁函,关闭连接,清除资源...
基于注解
用法:
/**
* 基于注解的初始化方法和销毁方法
*/
@Component
public class MyConnector3 {
public MyConnector3() {
System.out.println("MyConnector: 调用构造函数...");
}
public Object getConnection() {
System.out.println("获取连接...");
return null;
}
@PreDestroy
public void destroy() {
System.out.println("MyConnector: 调用销毁函,关闭连接,清除资源...");
}
@PostConstruct
public void init() throws Exception {
System.out.println("MyConnector: 调用初始化函数,创建连接...");
}
}
- @PostConstruct:设置初始化方法;
- @PreDestroy:设置销毁方法;
xml配置:
<context:component-scan base-package="com.bailiban.day2.lifecycle" />
如果提示找不到@PostConstruct,则需要在pom.xml中添加依赖:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
测试:
/**
* 基于注解的初始化方法和销毁方法
*/
static void annotationTest() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"com/bailiban/day2/lifecycle/lifecycle.xml");
context.getBean(MyConnector3.class).getConnection();
context.close();
}
运行结果:
MyConnector: 调用构造函数...
MyConnector: 调用初始化函数,创建连接...
获取连接...
MyConnector: 调用销毁函,关闭连接,清除资源...