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进行再加工。

经验分享 程序员 微信小程序 职场和发展