文末有本篇文章对应的项目源码文件可供下载
生命周期方法概念
我们可以在组件类中定义一个或者两个方法,然后当Spring IoC容器实例化和销毁组件类对象的时候进行自动调用.我们定义的方法就叫做组件的生命周期方法.
类似于Servlet的init/destroy方法,Tomcat可以在创建Servlet时自动执行Servlet的init方法,在销毁Servlet时自动执行Servlet的destroy方法,以此来完成Servlet的初始化和释放资源等业务逻辑。
0.配置思路
1.搭建好项目之后,编写Customer.java组件类,并在组件类中定义init方法和clear方法.
2.配置applicationContext.xml文件,配置组件类信息
3.编写SpringTest.java,进行测试.
1.配置pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.14</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
</dependencies>
2.编写Customer.java自定义组件类
public class Customer {
/**
* 组件初始化方法
*/
public void init() {
System.out.println("Initializing Customer");
}
/**
* 组件销毁方法
*/
public void clear() {
System.out.println("Clearing Customer");
}
}
初始化方法与销毁方法的命名是自定义的,但是在其他方面有一定的要求:
- 必须是public
- 必须是void
- 必须是无参数的
3.编写applicationContext.xml文件,配置组件类信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置自定义组件类-->
<!-- init-method: 定义组件初始化函数-->
<!-- destroy-method: 定义组件销毁函数-->
<bean id="customer" class="com.my.ssm.Customer" init-method="init" destroy-method="clear"/>
</beans>
4.编写SpringTest.java测试文件
public class SpringTest {
@Test
public void test1() {
// 创建Spring IoC容器,创建完成就会自动进行组件类对象的实例化
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 该方法是为了Spring IoC容器正常结束
context.close();
}
}
我们可以发现,我们在程序中调用了context对象的close()方法,该方法是为了正常关闭Spring IoC容器.
在Spring IoC容器正常结束的情况下,Spring IoC容器才会去调用组件类对象的destroy-method所对应的销毁方法;
在Spring IoC容器异常关闭的情况下,因为Spring IoC异常关闭了,所以还没有来得及调用组件类对象的destroy-method所对应的销毁方法,因此销毁方法是不执行的,
感兴趣的朋友可以测试下,将该语句删除之后,看是否还会执行组件类对象所对应的销毁方法.
close方法不是ApplicationContext这个接口的方法,而是AbstractApplicationContext类的方法,对于ClassPathXmlApplicationContext这个Spring IoC容器的是实现类,它是继承AbstractApplicationContext类,所以我们可以通过ClassPathXmlApplicationContext类对象来去调用close方法,但是通过ApplicationContext类对象是无法调用close方法的.