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

本文深入探讨了Spring框架中@PostConstruct、@PreDestroy等注解的执行顺序,以及与注入顺序的关系,通过具体示例展示了如何在Java层面自定义组件的生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次的博客比较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!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值