Spring容器bean生命周期方法

部分bean的生命周期方法

BeanPostProcessor

这个是容器级别的,也就是说对所有的bean初始化过程都会参与。

public interface BeanPostProcessor {
	//初始化前执行
	Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception;
	//初始化后执行
	Object postProcessAfterInitialization(Object bean, String beanName) throws Exception;

}

使用:实现BeanPostProcessor 接口,实现两个方法即可。

public class BeanInitializeLogger implements BeanPostProcessor {
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception {
		System.out.println("Initialize bean " + beanName + " start!");
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws Exception {
		System.out.println("Initialize bean " + beanName + " end!");
		return bean;
	}
}

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“spring.xml”);
初始化的时候构造方法会调用refresh()方法:

  • loadBeanDefinitions(beanFactory); 加载xml中的beanDefinition
  • registerBeanPostProcessors(beanFactory); 注册beanpostprocessor
  • preInstantiateSingletons(); 初始化

在每一个bean创建的时候都会调用BeanPostProcessor的方法

@Override
public Object getBean(String name) throws Exception {
	BeanDefinition beanDefinition = beanDefinitionMap.get(name);
	if (beanDefinition == null) {
		throw new IllegalArgumentException("No bean named " + name + " is defined");
	}
	Object bean = beanDefinition.getBean();
	if (bean == null) {
		bean = doCreateBean(beanDefinition);
		//执行BeanPostProcessor 方法
        bean = initializeBean(bean, name);
	}
	return bean;
}

protected Object initializeBean(Object bean, String name) throws Exception {
	for (BeanPostProcessor beanPostProcessor : beanPostProcessors) {
		bean = beanPostProcessor.postProcessBeforeInitialization(bean, name);
	}

	for (BeanPostProcessor beanPostProcessor : beanPostProcessors) {
           bean = beanPostProcessor.postProcessAfterInitialization(bean, name);
	}
    return bean;
}

BeanFactoryAware

这个是bean级别的,只有实现BeanFactoryAware接口的才会有用。

public interface BeanFactoryAware {
	//获取BeanFactory 
    void setBeanFactory(BeanFactory beanFactory) throws Exception;
}

使用:

public class Person implements BeanFactoryAware {

	private BeanFactory beanFactory;

	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws Exception {
		this.beanFactory = (AbstractBeanFactory) beanFactory;
	}
}

bean生命周期

参考链接

Spring中Bean的生命周期是怎样的? - 奔跑中的程序猿的回答 - 知乎
https://www.zhihu.com/question/38597960/answer/1663436917

在这里插入图片描述

  1. bean实例化
  2. bean初始化(设置属性,依赖注入)
  3. 调用BeanNameAware接口
  4. 调用BeanFactoryAware接口
  5. 调用 ApplicationContextAware接口
  6. beanPostprocessor 初始化前的方法
  7. InitializingBean的设置属性后置方法
  8. beanPostprocessor 初始化后的方法
  9. DisposableBean销毁方法

测试

@Component
public class Person implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {
    private String name;
    private BeanFactory beanFactory;
    private String beanName;

    public Person(){
        System.out.println("【 构造器 】 -> 调用Person实例化");
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }

    public void setName(String name) {
        System.out.println("【 注入属性 】 -> 注入属性name");
        this.name = name;
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("【 BeanFactoryAware接口 】 -> 调用BeanFactoryAware.setBeanFactory()");
        this.beanFactory = beanFactory;
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("【 BeanNameAware接口 】 -> 调用BeanNameAware.setBeanName()");
        this.beanName = s;
    }

    //对应通过<bean>的destroy-method属性指定的初始化方法
    @Override
    public void destroy() throws Exception {
        System.out.println("【 DiposibleBean接口 】 -> 调用DiposibleBean.destory()");
    }

    //对应通过<bean>的init-method属性指定的初始化方法
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("【 InitializingBean接口 】 -> 调用InitializingBean.afterPropertiesSet()");
    }
}
@Component
public class CumtomBeanPostprocessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof Person){
            System.out.println("【 BeanPostProcessor 】 -> " + beanName + " start!");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof Person){
            System.out.println("【 BeanPostProcessor 】 -> " + beanName + " end!");
        }
        return bean;
    }
}

控制台打印顺序

【 构造器 】 -> 调用Person实例化
【 BeanNameAware接口 】 -> 调用BeanNameAware.setBeanName()
【 BeanFactoryAware接口 】 -> 调用BeanFactoryAware.setBeanFactory()
【 BeanPostProcessor 】 -> person start!
【 InitializingBean接口 】 -> 调用InitializingBean.afterPropertiesSet()
【 BeanPostProcessor 】 -> person end!
【 DiposibleBean接口 】 -> 调用DiposibleBean.destory()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring bean 容器生命周期可以分为三个阶段:实例化、初始化和销毁。 1. 实例化阶段:在这个阶段,Spring 容器会根据配置信息创建 bean 的实例。根据配置的不同,Spring 可以通过构造函数实例化 bean,也可以通过工厂方法来创建实例。在这个阶段,Spring 只是创建了对象的实例,并没有进行属性注入或其他初始化操作。 2. 初始化阶段:在实例化后,Spring 容器会对 bean 进行初始化。这个阶段包括以下几个步骤: - 属性注入:Spring 容器会将配置的属性值注入到 bean 的属性中,可以通过 XML 配置或注解来完成属性注入。 - Aware 接口回调:如果 bean 实现了 Aware 接口,容器会调用相应的回调方法,让 bean容器的一些特定情况做出响应。 - 自定义初始化方法:如果在配置中指定了自定义的初始化方法Spring 容器会调用该方法进行额外的初始化操作。 3. 销毁阶段:当 Spring 容器关闭时,会触发 bean 的销毁操作。销毁阶段包括以下几个步骤: - 实现 DisposableBean 接口:如果 bean 实现了 DisposableBean 接口,容器会调用其 destroy() 方法进行销毁操作。 - 自定义销毁方法:如果在配置中指定了自定义的销毁方法Spring 容器会调用该方法进行额外的销毁操作。 需要注意的是,对于单例作用域的 bean,默认情况下 Spring 容器会管理其完整的生命周期,而对于原型作用域的 beanSpring 容器只负责创建和初始化,不会进行销毁操作,需要手动释放资源。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值