Bean在不同作用域内的生命周期
Bean的生命周期是指Bean实例被创建、初始化和销毁的过程。在Bean的两种作用域singleton和prototype中,Spring容器对Bean的生命周期的管理是不同的。在singleton作用域中,Spring容器可以管理Bean的生命周期,控制着Bean的创建、初始化和销毁。在prototype作用域中, Spring容器只负责创建Bean实例,不会管理其生命周期。
Bean生命周期的两个时间节点
在Bean的生命周期中,有两个时间节点尤为重要,这两个时间节点分别是Bean实例初始化后和Bean实例销毁前,在这两个时间节点通常需要完成一些指定操作。因此,常常需要对这两个节点进行监控。
监控时间节点的方式
监控两个节点的方式有两种,一种是使用XML配置文件,一种是使用注解。
Spring容器提供了@PostConstruct用于监控Bean对象初始化节点, 提供了@PreDestroy用于监控Bean对象销毁节点。下面通过案例演示这两个注解的使用。
1、创建Student类,在类中定义id和name字段,并使用@PostConstruct指定初始化方法,使用@PreDestroy指定Bean销毁前的方法。
@Component("student")
public class Student {
@Value("1")
private String id;
@Value("张三")
private String name; // 省略getter/setter方法,以及toString()方法
@PostConstruct
public void init(){System.out.println("Bean的初始化完成,调用init()方法"); }
@PreDestroy
public void destroy(){System.out.println("Bean销毁前调用destroy()方法"); }}
2、创建applicationStudent.xml,在该文件中引入Context约束并启动Bean的自动扫描功能。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 使用context命名空间,在配置文件中开启相应的注解处理器 -->
<context:component-scan base-package="com.mac" />
</beans>
3、创建测试类StudentTest,在该类中编写测试代码,通过Spring容器加载配置文件并获取Student实例。
public class StudentTest {
public static void main(String[] args){
ApplicationContext applicationContext=new
ClassPathXmlApplicationContext("applicationStudent.xml");
Student student=(Student)applicationContext.getBean("student");
System.out.println(student);
//销毁Spring容器中的所有Bean
AbstractApplicationContext ac=(AbstractApplicationContext)
applicationContext;
ac.registerShutdownHook();
}}
4、在IDEA中启动StudentTest类,控制台会输出结果。