Spring Bean生命周期
1. Bean的生命周期概览
Bean的生命周期包括以下几个关键阶段:
- 实例化:当Spring容器启动时,它会首先实例化Bean对象。
- 设置属性:通过Spring配置文件或注解,Spring容器会自动为Bean设置依赖的属性。
- Aware接口:若Bean实现了
BeanNameAware
和BeanFactoryAware
接口,Spring容器会在这个阶段注入Bean的名字和BeanFactory。 - Bean后处理器的before方法执行
- 初始化:Bean完成属性注入后,容器会调用Bean的初始化方法(无论是通过
InitializingBean
接口,还是通过@PostConstruct
注解或者@Bean(initMethod)
方法)。 - Bean后处理器的after方法执行
- 使用Bean
- 销毁:当容器关闭时,Bean会调用销毁方法(通过
DisposableBean
接口、@PreDestroy
注解或者@Bean(destroyMethod)
方法)。
2. 示例解析
我们用一个简单的例子来说明Spring Bean的生命周期。
2.1 配置类 (BeanConfig.java
)
首先,我们定义一个配置类BeanConfig
,通过@Configuration
注解标识为配置类。@Bean
注解用于定义一个Bean实例,并指定初始化和销毁方法。
@Configuration
public class BeanConfig {@Bean(initMethod = "initBean", destroyMethod = "destoryBean")public User user() {User user = new User();user.setName("admin");return user;}
}
在这个类中,我们定义了一个名为user
的Bean,并指定了初始化方法initBean
和销毁方法destoryBean
。
2.2 主应用程序 (DemoApplication.java
)
主应用程序类通过SpringApplication.run()
启动Spring应用,获取user
Bean并在控制台输出它的名字。最后,调用context.close()
关闭容器,触发销毁方法的执行。
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);User user = context.getBean("user", User.class);System.out.println("7. 使用bean:" + user.getName());context.close();}
}
2.3 后处理器 (LogBeanPostProcessor.java
)
LogBeanPostProcessor
是一个自定义的Bean后处理器,它实现了BeanPostProcessor
接口,用来在Bean初始化前后做一些额外操作。
@Component
public class LogBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof User) {System.out.println("4. Bean后处理器的before方法执行,即将开始初始化");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof User) {System.out.println("6. Bean后处理器的after方法执行,初始化完成");}return bean;}
}
2.4 Bean类 (User.java
)
User
类实现了多个Spring生命周期接口,并定义了自定义的初始化和销毁方法。
public class User implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {private String name;// 构造函数public User() {System.out.println("1. 实例化Bean");}// 设置属性public void setName(String name) {this.name = name;System.out.println("2. 设置属性");}@Overridepublic void setBeanName(String name) {System.out.println("3. Aware相关接口,Bean名字:" + name);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("3. Aware相关接口,BeanFactory: " + beanFactory);}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("5. 实现InitializingBean接口的afterPropertiesSet执行初始化");}@PostConstructpublic void 自定义初始化bean() {System.out.println("5. 使用PostConstruct初始化bean");}@Overridepublic void destroy() throws Exception {System.out.println("8. 实现DisposableBean接口的destroy执行销毁");}public void destoryBean() {System.out.println("8. 使用@Bean(destroyMethod)销毁bean");}@PreDestroypublic void 自定义销毁bean() {System.out.println("8. 使用PreDestroy注解销毁bean");}public String getName() {return name;}private void initBean() {System.out.println("5. 使用@Bean(initMethod)初始化bean");}
}
2.5 输出结果
当你运行应用时,你将看到如下输出:
1. 实例化Bean
2. 设置属性
3. Aware相关接口,Bean名字:user
3. Aware相关接口,BeanFactory: org.springframework.beans.factory.support.DefaultListableBeanFactory@6d0e50e4
4. Bean后处理器的before方法执行,即将开始初始化
5. 使用PostConstruct初始化bean
5. 实现InitializingBean接口的afterPropertiesSet执行初始化
6. Bean后处理器的after方法执行,初始化完成
7. 使用bean:admin
8. 使用PreDestroy注解销毁bean
8. 使用@Bean(destroyMethod)销毁bean
8. 实现DisposableBean接口的destroy执行销毁