spring bean的生命周期以及测试(详细白话)

spring是一个ioc容器,容器初始化时,将初始化所有配置,或通过包扫描注入的bean。

某一个bean的生命周期:

  1. new这个bean
  2. 初始化这个bean依赖的bean2
  3. 将依赖的bean2注入到这个bean
  4. 如果这个bean实现了BeanNameAware接口,调用其实现方法setBeanName(配置的ID或注解传入的ID)
  5. 如果这个bean实现了BeanFactoryAware接口,调用其实现方法setBeanFactory(可获取到BeanFactory)
  6. 如果这个bean实现了ApplicationContextAware接口,调用其实现方法setApplicationContext(可获取到applicationContext)
  7. 如果这个bean实现了BeanPostProcessor接口,调用其实现方法postProcessBeforeInitialization(可用于修改这个bean)
  8. 如果这个bean实现了InitializingBean接口,调用其实现方法afterPropertiesSet(bean的初始化方法)
  9. 如果这个bean是配置式,配置了init-method,则调用init-method指定的方法
  10. 如果这个bean实现了BeanPostProcessor接口,调用其实现方法postProcessAfterInitialization(可用于修改这个bean)
  11. 如果这个bean实现了DisposableBean接口,在这个bean销毁时,调用其实现方法destroy
  12. 如果这个bean是配置式,配置的destroy-method,在这个bean销毁时,则调用destroy-method指定的方法

测试验证:

@Component("bt")
public class BeanTest implements BeanNameAware,ApplicationContextAware,BeanPostProcessor,InitializingBean,DisposableBean,BeanFactoryAware {
	@Resource(name = "bt2")
	private BeanTest2 bt2;
	
	

	public BeanTest() {
		super();
		System.err.println("new了BeanTest");
	}

	public BeanTest2 getBt2() {
		return bt2;
	}

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

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


	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		System.err.println("设置applicationContext上下文");
	}

	@Override
	public void setBeanName(String name) {
		System.err.println("设置bean名称: " + name);
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.err.println("初始化前");
		System.err.println(bean + ":" + beanName);
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.err.println("初始化后");
		System.err.println(bean + ":" + beanName);
		return bean;
	}
	
	@Override
	public void setBeanFactory(BeanFactory arg0) throws BeansException {
		System.err.println("设置beanFactory上下文");
		
	}
	
	public static void main(String[] args) {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
		applicationContext.registerShutdownHook();
		//applicationContext.getBean("bt");
	}

	

}
@Component("bt2")
public class BeanTest2{

	public BeanTest2() {
		super();
		System.err.println("bt2初始化");
	}
	
}

测试用的两个类:BeanTest,BeanTest2

BeanTest2是BeanTest需要依赖注入的

用main方法测试的话

结果:


可看出执行顺序大体是一致的,不过少了BeanPostProcessor的实现方法

如果直接开启项目:

这个BeanPostProcessor的实现方法出现,不过并不是生效在当前的bean,而是生效在非当前bean的其他bean。

原因暂时未知,有知道的大神方便评论。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Bean 生命周期指的是一个 Bean 在容器中从创建、初始化、使用到销毁的整个过程。Spring 容器负责管理 Bean 的整个生命周期SpringBean 提供了一些回调方法,开发人员可以在这些方法中添加自己的逻辑。 Spring Bean 的生命周期可以分为以下几个阶段: 1. 实例化阶段 当容器接收到创建 Bean 的请求时,会首先根据配置信息或注解创建 Bean 的实例对象。 2. 属性赋值阶段 容器会将配置文件中或注解中的属性值注入到 Bean 实例对象中,包括基本类型、引用类型、集合类型等。 3. Aware 阶段 容器会调用 Bean 实例对象实现的 Aware 接口方法,让 Bean 对容器或其他资源有感知能力,如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 等。 4. 初始化阶段 在 Bean 实例对象的所有属性被注入后,容器会调用 Bean 实例对象的初始化方法,可以通过实现 InitializingBean 接口或在配置文件中指定 init-method 方法来实现。 5. 使用阶段 Bean 实例对象初始化完成后,可以被容器使用或被其他 Bean 引用。 6. 销毁阶段 当容器关闭或销毁 Bean 时,会调用 Bean 实例对象的销毁方法,可以通过实现 DisposableBean 接口或在配置文件中指定 destroy-method 方法来实现。 在 Spring Bean 生命周期的每个阶段中都有一些回调方法可以供开发人员实现自己的逻辑,如 BeanPostProcessor、BeanFactoryPostProcessor、InstantiationAwareBeanPostProcessor 等。这些回调方法可以在容器初始化时被调用,从而对 Bean 的实例化、属性赋值、初始化和销毁等过程进行干预和处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值