1、bean实例化前
1)BeanNameAware接口
2)BeanFactoryAware接口
2、bean实例化完成(对象创建)
1)ApplicationContextAware接口
获取spring上下文,说明bean已经实例化完成(构造方法执行完成)
spring容器相当于一个大型的工厂,里面的产品就是实例化的bean
实例化的理解:我的理解是实例化应该是spring的容器BeanFactory(ApplicantContext)将Object bean转变为一个具体的Bean的过程
3、bean实例化后的资源的初始化和销毁
bean实例化是spring把bean的对象生成了,但是bean中如有资源需要初始化的话,可以使用以下方式
以下是在对象加载完,依赖注入(@Autowired、@Value)后执行
1)@PostConstruct注解:bean初始化方法
2)InitializingBean接口:bean初始化之后执行,调用afterPropertiesSet方法
3)xml中配置init-method:指定初始化方法
4)@PreDestroy注解:bean销毁之前执行
5)DisposableBean接口:bean销毁前回收资源,调用destroy方法
6)xml中配置destory-method:指定销毁方法
7)在初始化方法之后会执行SmartLifecycle接口的start方法
SmartLifecycle接口是spring容器在所有bean加载和初始化完毕后执行回调
8)BeanPostProcessor是一个公共功能的接口,它是spring提供的扩展接口,对spring上下文中所有的bean,spring初始化类时都会调用一遍postProcessBeforeInitialization和postProcessAfterInitialization方法
初始化之前调用postProcessBeforeInitialization
初始化之后调用postProcessAfterInitialization
4、建立测试类BeanLifeCycle.java
package com.study.domain.testBean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.SmartLifecycle;
import org.springframework.stereotype.Component;
@Component
public class BeanLifeCycle implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean,
DisposableBean, SmartLifecycle, BeanPostProcessor {
private boolean isRunning = false;
@Override
public void setBeanName(String name) {
System.out.println("========== 执行BeanNameAware接口");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("========== 执行BeanFactoryAware接口");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("========== 执行ApplicationContextAware接口");
}
@PostConstruct
public void initBean() {
System.out.println("========== 执行@PostConstruct注解");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("========== 执行InitializingBean接口");
}
@PreDestroy
public void destroyBean() {
System.out.println("========== 执行@PreDestroy注解");
}
@Override
public void destroy() throws Exception {
System.out.println("========== 执行DisposableBean接口");
}
@Override
public void start() {
System.out.println("========== 执行SmartLifecycle接口start方法");
isRunning = true;
}
@Override
public void stop() {
System.out.println("========== 执行SmartLifecycle接口stop方法");
isRunning = false;
}
/**
* 返回true时start方法会被自动执行,返回false则不会
*/
@Override
public boolean isAutoStartup() {
System.out.println("========== 执行SmartLifecycle接口isAutoStartup方法");
return true;
}
/**
* 1. 只有该方法返回false时,start方法才会被执行。<br/>
* 2. 只有该方法返回true时,stop(Runnable callback)或stop()方法才会被执行。
*/
@Override
public boolean isRunning() {
System.out.println("========== 执行SmartLifecycle接口isRunning方法");
return isRunning;
}
/**
* 如果工程中有多个实现接口SmartLifecycle的类,则这些类的start的执行顺序按getPhase方法返回值从小到大执行。<br/>
* 例如:1比2先执行,-1比0先执行。 stop方法的执行顺序则相反,getPhase返回值较大类的stop方法先被调用,小的后被调用。
*/
@Override
public int getPhase() {
return 0;
}
@Override
public void stop(Runnable callback) {
System.out.println("========== 执行SmartLifecycle接口stop(Runnable callback)方法");
callback.run();
isRunning = false;
}
/**
* 实例化Bean之前
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if ("threadPool".equals(beanName)) {
System.out.println("========== 执行postProcessBeforeInitialization方法" + beanName);
}
return bean;
}
/**
* 实例化Bean之后
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("threadPool".equals(beanName)) {
System.out.println("========== 执行postProcessAfterInitialization方法" + beanName);
}
return bean;
}
}
5、启动容器
显示的日志信息
========== 执行BeanNameAware接口
========== 执行BeanFactoryAware接口
========== 执行ApplicationContextAware接口
========== 执行@PostConstruct注解
========== 执行InitializingBean接口
========== 执行postProcessBeforeInitialization方法threadPool
========== 执行postProcessAfterInitialization方法threadPool
========== 执行SmartLifecycle接口isRunning方法
========== 执行SmartLifecycle接口isAutoStartup方法
========== 执行SmartLifecycle接口start方法
//这里正常使用bean
========== 执行SmartLifecycle接口isRunning方法
========== 执行SmartLifecycle接口stop(Runnable callback)方法
========== 执行@PreDestroy注解
========== 执行DisposableBean接口
1)初始化threadPool对象之前
========== 执行postProcessBeforeInitialization方法threadPool
2)初始化threadPool对象
3)初始化threadPool对象之后
========== 执行postProcessAfterInitialization方法threadPool
postProcessBeforeInitialization这里只取了一个bean的名字threadPool
问题:此时,它的变量有没有初始化?它依赖的对象有没有注入?
经测试,在执行postProcessBeforeInitialization时,实例的变量已经注入了。是先有实例变量,再调用类的构造方法
6、对象创建的生命周期
整个对象创建的生命周期和执行顺序
类变量 -> 类块 -> 实例变量 -> 实例块 -> 实例构造器
整个构造器执行成功之后,才算对象创建完成
执行实例块的时候,实例变量申明了,但是没有初始化
参考资料:
https://blog.csdn.net/qq_43716366/article/details/107307808
https://blog.csdn.net/caihaijiang/article/details/35552859