bean生命周期管理
spring对bean的生命周期的操作提供了支持,java配置和注解配置分别使用如下方式:
1、java配置:使用@Bean 的initMethod和destoyMethod
2、注解方式:@PostConstruct和@PreDestroy
java配置是通过@Configuration与@Bean来实现的, spring4.x和springboot都推荐使用java配置,它可以完全替代xml配置
使用 @Configuration 注解表明当前类是一个配置类,这个类里可能有0或多个 @Bean注解。
问
:为什么不直接用@Component来注入一个bean?
一般情况使用@Component装配Bean,但它只能注解在类上,不能注解在方法上,对于Java而言,大部分的开发都需要引入第三方包,而且往往看不到源码,所以就无法为这些类添加@Component注解让他们变为开发环境的Bean,而spring提供的@Bean注解可以解决这一问题。
使用@Bean 注解标注一个方法(而且只能使用在方法上),表明当前方法的返回值是一个Bean,Bean的名称是方法名,也可以通过name属性设置beanName。如@Bean(name = “dataSource”)
代码如下:
//用@Bean来定义
public class BeanWayService {
public void init(){
System.out.println("@Bean-init-method");
}
public void destroy(){
System.out.println("@Bean-destroy-method");
}
public BeanWayService(){
super();
System.out.println("初始化构造函数。。");
}
}
//@PostConstruct和@PreDestroy
public class BeanWay2Service {
@PostConstruct
public void init(){
System.out.println("@Bean-postConstruct");
}
@PreDestroy
public void destroy(){
System.out.println("@Bean-preDestroy");
}
public BeanWay2Service(){
super();
System.out.println("初始化构造函数。。");
}
}
@Configuration
@ComponentScan("com.changhf.javaconfig")
public class PrePostConfig {
//方法一
@Bean(initMethod = "init", destroyMethod = "destroy")
BeanWayService beanWayService() {
return new BeanWayService();
}
//方法二
@Bean
BeanWay2Service beanWay2Service() {
return new BeanWay2Service();
}
}
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PrePostConfig.class);
context.close();
}
}
@PostConstruct,在构造函数执行完之后执行;@PreDestroy在bean销毁之前执行
输出结果:
初始化构造函数。。
@Bean-init-method
初始化构造函数。。
@Bean-postConstruct
@Bean-preDestroy
@Bean-destroy-method
@Bean具体用法可以参考:@Bean的具体用法
spring的InitailizingBean与DisposableBean
相比较jdk提供的@PostConstruct,spring还提供里另外一种初始化方式:
实现InitializingBean
接口,它仅仅包含一个方法afterPropertiesSet()
;
实现DisposableBean
接口,它仅仅包含一个方法destroy()
;
虽然使用该接口导致程序和spring的耦合度高,但它代码简洁,对于使用spring的系统来说还是首选。
它为实现该接口的类提供默认的初始化和销毁方法
@Component
public class StudentService implements InitializingBean {
@Autowired
private UserService userService;
@Override
public void afterPropertiesSet() throws Exception {
userService.update(1L);
System.out.println("----------bean initialized-----------");
}
}
BeanPostProcessor
BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口,可以为每个bean实例化时提供个性化的修改,做些包装等
public interface BeanPostProcessor {
//bean初始化前执行
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
//bean初始化后执行
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
执行步骤:
1、Spring IOC容器实例化Bean
2、调用postProcessBeforeInitialization方法
3、调用bean实例的初始化方法
4、调用postProcessAfterInitialization方法
spring容器通过BeanPostProcessor给了我们一个机会对Spring管理的bean进行再加工。