Spring 生命周期

这里将spring 生命周期分成4个部分讲解

第一步 实例化及属性注入

加载xml文件  读取bean 对配置bean中的对象进实例化

这里会调用bean的默认构造方法 和属性的set方法

第二步 这里一系列操作都是在进行检查bean是否实现了一些接口 如果实现就执行该方法

1.如果实现了BeanNameAware接口 那么会调用setBeanName方法 这个方法有个参数就是 bean定义的name


	@Override
	public void setBeanName(String beanName) {
		System.out.println("实现BeanNameAware接口,暴露beanName="+beanName);
		
	}

2.如果实现了beanFactory接口 那么久调用setBeanFactory方法 这个方法有个BeanFactory对象参数

@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {		
		System.out.println("实现beanFactory接口,暴露beanFactory信息="+beanFactory.getBean(this.getClass()));
	}

 

3.如果实现了 ApplicationContextAware接口,那么就会调用setApplicationContext方法


	@Override
	public void setApplicationContext(ApplicationContext aContext) throws BeansException {
		
		System.out.println("实现ApplicationContextAware接口,调用 
                                       setApplicationContext方法 "+aContext.getId());
	}

第三步,初始化阶段

这个是一个单独的类 类似于增强类

1.如果该类实现了BeanPostProcessor接口 那么在初始化之前会执行postProcessBeforeInitialization这个方法

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("在初始化之后执行"+bean+" name="+beanName);
		return bean;
	}

2.回到开始的那个类 如果该类实现InitializingBean接口 那么就会调用afterPropertiesSet方法

    @Override
	public void afterPropertiesSet() throws Exception {
		
		System.out.println("实现InitializingBean接口,执行初始化方法");
		
	}

3.如果你在bean标签中定义了init-method 则会执行你自定义的初始化方法

public void initF() {
	   System.out.println("执行自定义初始化方法");
	}
	

4.再执行BeanPostProcessor接口中的postProcessAfterInitialization方法

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {		
		System.out.println("在初始化之前执行"+bean+" name="+beanName);
		return bean;
	}

第4步 销毁阶段

1.如果该类实现了DisposableBean接口在容器关闭时 执行setApplicationContext方法 这里关闭需要执行ClassPathXmlApplicationContext的close()方法


	@Override
	public void setApplicationContext(ApplicationContext aContext) throws BeansException {
		
		System.out.println("实现ApplicationContextAware接口,容器关闭时调用setApplicationContext方法 "+aContext.getId());
	}

2.如果在Bean标签中定义了destroy-method属性 则执行你定义的方法

<bean id="student" class="com.woniu.entity.Student" init-method="initF" destroy-method="destroyF" >
  <property name="name" value="张三" ></property>
</bean>

public void destroyF() {
		System.out.println("执行自定义销毁方法");
	}

这里整个生命周期结束 我把所有的接口都实现了 先贴一个执行结果

实例化方法
调用setter方法
实现BeanNameAware接口,暴露beanName=student
实现beanFactory接口,暴露beanFactory信息=com.woniu.entity.Student@32d2fa64
实现ApplicationContextAware接口,调用setApplicationContext方法 org.springframework.context.support.ClassPathXmlApplicationContext@277c0f21
在初始化之前执行com.woniu.entity.Student@32d2fa64 name=student
实现InitializingBean接口,执行初始化方法
执行自定义初始化方法
在初始化之后执行com.woniu.entity.Student@32d2fa64 name=student
实现DisposableBean接口,容器关闭时调用destroy方法
执行自定义销毁方法

需要代码的话 请下载 赚点积分不容易。链接:https://download.csdn.net/download/ly610501737/11250969

注意下载的代码中 ApplicationContextAware接口 这里是我写错了 文章已改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值