Spring中@PostConstruct、@PreDestroy、InitializingBean、DisposableBean、initMethod、des

这次的博客比较Spring中@PostConstruct、@PreDestroy、InitializingBean、DisposableBean、initMethod、destoryMethod的执行顺序,顺便会将construct以及与注入顺序一并比较

 

为了方便起见,这次不使用xml文件定义bean,完全采用注解配置,共3个类,都放在annotations包下

下面是定义的两个bean,Bean2直接加上@Conponent注解,加入到ioc容器

而Bean1,有1个注入属性、1个普通属性、1个构造器、3个初始化方法、3个销毁方法

public class Bean1 implements InitializingBean, DisposableBean{
	
	@Autowired
	public Bean2 bean2;
	
	public String state;
	
	public Bean1 (){
		state = "construct!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}
	
	public void init_method (){
		state = "init-method!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}
	
	public void destory_method (){
		state = "destory-method!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}
	
	@PostConstruct 
	public void postConstruct (){
		state = "postConstruct!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}
	
	@PreDestroy 
	public void preDestory (){
		state = "preDestory!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}

	@Override
	public void destroy() throws Exception {
		state = "destory!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		state = "afterPropertiesSet!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}

}

@Component
public class Bean2 {
	
}

 

不要奇怪为什么Bean1没有加入到ioc容器,我们下面马上进行:

@Configuration
@org.springframework.context.annotation.ComponentScan(basePackages = "annotations")
public class ComponentScan {
	
	@Bean(initMethod = "init_method", destroyMethod = "destory_method")
	public Bean1 bean1 (){
		return new Bean1();
	}

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
		ctx.register(ComponentScan.class);
		ctx.refresh();
		ctx.registerShutdownHook();
	}
	
}

 可以通过@Configuration注册bean,和xml是一样的效果

 

打印结果为

bean1 -> construct!...bean2: null
bean1 -> postConstruct!...bean2: annotations.Bean2@35fc6dc4
bean1 -> afterPropertiesSet!...bean2: annotations.Bean2@35fc6dc4
bean1 -> init-method!...bean2: annotations.Bean2@35fc6dc4
bean1 -> preDestory!...bean2: annotations.Bean2@35fc6dc4
bean1 -> destory!...bean2: annotations.Bean2@35fc6dc4
bean1 -> destory-method!...bean2: annotations.Bean2@35fc6dc4

 

所以执行顺序如下:

初始化时:构造器Construct  ->  属性注入  ->  @PostConstruct  ->  InitializingBean接口  ->  bean定义的initMethod 

销毁时:@PreDestroy  ->  DisposableBean接口 ->  bean定义的destoryMethod

 

When you work directly in Java, you can do anything you like with your objects and do not always need to rely on the container lifecycle!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值