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()方法@PostConstructpublic void init(){System.out.println("Bean的初始化完成,调用init()方法"); }@PreDestroypublic 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://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容器中的所有BeanAbstractApplicationContext ac=(AbstractApplicationContext)applicationContext;ac.registerShutdownHook();
}}
4、在IDEA中启动StudentTest类,控制台会输出结果。