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具体用法可以参考:@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进行再加工。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值