这里将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接口 这里是我写错了 文章已改