spring中Bean的生命周期介入的几种方法,及重要spring源码位置

代码目录:
在这里插入图片描述

bean的生命周期几个过程:创建–>初始化–>销毁

1.@Bean(initMethod=“方法1”,destroyMethod=“方法2”)

public class Bike {
	public Bike(){
		System.out.println("创建。。。。。");
	}

	public void init(){
		System.out.println("初始化。。。。。");
	}

	public void destory(){
		System.out.println("销毁===========");
	}
}

@Configuration
@ComponentScan("com.demo6")
public class SampleConfig {

	@Bean(initMethod = "init",destroyMethod = "destory")
	public Bike bike(){
		return new Bike();
	}

}

public class SampleTest {
	@Test
	public void test01(){
		AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(SampleConfig.class);
		String[] names = app.getBeanDefinitionNames();
		app.close();
	}
}

根据上面代码找到对应调用init()方法的spring源码位置重要代码片段org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java:
在这里插入图片描述

2.实现接口InitializingBean, DisposableBean相当于初始与销毁(也可做相应功能的工作)

public class Bike implements InitializingBean, DisposableBean {
	public Bike(){
		System.out.println("创建。。。。。");
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("初始化。。。。。");
	}

	@Override
	public void destroy() throws Exception {
		System.out.println("销毁===========");
	}
}

@Configuration
@ComponentScan("com.demo6")
public class SampleConfig {

	@Bean
	public Bike bike(){
		return new Bike();
	}

}

public class SampleTest {
	@Test
	public void test01(){
		AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(SampleConfig.class);
		app.close();
	}
}

源代码同样为上面提到的重要位置,唯一不同的是实现接口的调用走了两个不同的逻辑,进入org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods方法看看:
在这里插入图片描述
从上面的代码可知执行优先级高的为接口实现的

@PostConstruct与@PreDestroy为java JSR250注解

public class Bike implements InitializingBean, DisposableBean {
	public Bike(){
		System.out.println("创建。。。。。");
	}
	@PostConstruct
	public void init2(){
		System.out.println("初始化==PostConstruct注解。。。。。");
	}

	@PreDestroy
	public void destory2() throws Exception {
		System.out.println("销毁==PreDestroy注解。。。。。。。");
	}
}

在这里插入图片描述
具体最终调用:
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.LifecycleElement#invoke
在这里插入图片描述
说明此PostConstruct也是通过InitDestroyAnnotationBeanPostProcessor后置处理器实现的。
优先级此jsr250是最高的。最先执行。
jsr250(PostConstruct/PreDestroy)–>InitializingBean, DisposableBean–>@Bean(initMethod = “”,destroyMethod = “”)

4.使用BeanPostProcessors接口后置处理器完成一个

public class SampleBeanPostProcessor implements BeanPostProcessor {
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		//返回一个对象(传过来的对象)
		//在初始化方法调用之前进行后置处理工作
		//在什么时候调用:initMethod之前
		System.out.println("postProcessBeforeInitialization.....==="+beanName+"========="+bean);
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("postProcessAfterInitialization.....》》》》》》"+beanName+"》》》》》》"+bean);

		return null;
	}
}

@Configuration
@ComponentScan("com.demo7")
public class SampleConfig {

	@Bean(initMethod = "init",destroyMethod = "destory1")
	public Bike bike(){
		return new Bike();
	}

	@Bean
	public SampleBeanPostProcessor sampleBeanPostProcessor(){
		return new SampleBeanPostProcessor();
	}
}

在上面图中重要代码位置调用
在这里插入图片描述
此优先级可以做到在JSR250之前调用

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值