Bean的初始化和销毁(java配置方式)
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具体用法可以参考:
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进行再加工。