bean lifecycle methods
We can define a bean initialization function and destructor, Spring will automatically call them at startup and shutdown.
xml-based
usage:
<bean id="connector" class="com.bailiban.day2.lifecycle.MyConnector"
init-method="init" destroy-method="destroy" />
- init-method: method of setting initialization;
- destroy-method: setting destruction method;
Example:
/**
* 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: 调用销毁函,关闭连接,清除资源...");
}
}
test:
/**
* 在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();
}
operation result:
MyConnector: 调用构造函数...
MyConnector: 调用初始化函数,创建连接...
获取连接...
MyConnector: 调用销毁函,关闭连接,清除资源...
Based Interface
usage:
/**
* 通过实现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: 调用初始化函数,创建连接...");
}
}
- Interface inheritance InitializingBean: afterPropertiesSet by rewriting method, a method is provided to initialize;
- Inheritance DisposableBean Interface: by overriding the destroy method, set the method of destruction;
test:
/**
* 通过实现InitializingBean接口,创建初始化方法
* 实现DisposableBean接口,创建销毁方法
*/
static void interfaceTest() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"com/bailiban/day2/lifecycle/lifecycle.xml");
context.getBean(MyConnector2.class).getConnection();
context.close();
}
operation result:
MyConnector: 调用构造函数...
MyConnector: 调用初始化函数,创建连接...
获取连接...
MyConnector: 调用销毁函,关闭连接,清除资源...
Based on notes
usage:
/**
* 基于注解的初始化方法和销毁方法
*/
@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: setting an initialization method;
- @PreDestroy: Setting destruction method;
xml configuration:
<context:component-scan base-package="com.bailiban.day2.lifecycle" />
If not able to find @PostConstruct, you need to add a dependency in pom.xml:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
test:
/**
* 基于注解的初始化方法和销毁方法
*/
static void annotationTest() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"com/bailiban/day2/lifecycle/lifecycle.xml");
context.getBean(MyConnector3.class).getConnection();
context.close();
}
operation result:
MyConnector: 调用构造函数...
MyConnector: 调用初始化函数,创建连接...
获取连接...
MyConnector: 调用销毁函,关闭连接,清除资源...