1、 大概生命周期
- 实例化对象(调用构造器new对象)
- 属性赋值(比如@Autowired就是在这里处理)
- 初始化
- 销毁
2、验证bean生命周期
代码准备
TotalAware
public class TotalAware implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, ApplicationContextAware,
InitializingBean {
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
}
@Override
public void setBeanName(String name) {
}
@Override
public void afterPropertiesSet() {
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
}
}
LifeCycleBean
@Slf4j
@Data
public class LifeCycleBean extends TotalAware {
private String username;
public LifeCycleBean() {
log.info("对象被创建了");
}
@Override
public void setBeanName(String name) {
log.info("BeanNameAware接口的setBeanName方法执行了{}", name);
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
log.info("BeanClassLoaderAware接口的setBeanClassLoader方法执行了 {}", classLoader);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
log.info("BeanFactoryAware接口的setBeanFactory方法执行了 {}", beanFactory.getClass());
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
log.info("ApplicationContextAware接口的setApplicationContext方法执行了 {}", applicationContext.getClass());
}
@PostConstruct
public void init() {
log.info("@PostConstruct注解的init方法执行了");
}
@Override
public void afterPropertiesSet() {
log.info("InitializingBean接口的afterPropertiesSet方法执行了");
}
public void initMethod() {
log.info("init-method方法执行了");
}
@PreDestroy
public void destroy() {
log.info("@PreDestroy注解的destroy方法执行了");
}
public void destroyMethod() {
log.info("destroy-method方法执行了");
}
}
AllLifeCycleBeanPostProcessor
@Component
@Slf4j
public class AllLifeCycleBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (beanClass.equals(LifeCycleBean.class)) {
log.info("postProcessBeforeInstantiation执行了");
}
return SmartInstantiationAwareBeanPostProcessor.super.postProcessBeforeInstantiation(beanClass, beanName);
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if (bean.getClass().equals(LifeCycleBean.class)) {
log.info("postProcessAfterInstantiation执行了");
}
return SmartInstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean, beanName);
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean.getClass().equals(LifeCycleBean.class)) {
log.info("postProcessBeforeInitialization执行了");
}
return SmartInstantiationAwareBeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean.getClass().equals(LifeCycleBean.class)) {
log.info("postProcessAfterInitialization执行了");
}
return SmartInstantiationAwareBeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
if (bean.getClass().equals(LifeCycleBean.class)) {
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("username", "qyh");
log.info("postProcessProperties执行了");
return propertyValues;
}
return SmartInstantiationAwareBeanPostProcessor.super.postProcessProperties(pvs, bean, beanName);
}
}
BeanConfig
@Configuration
public class BeanConfig {
@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
public LifeCycleBean lifeCycleBean() {
return new LifeCycleBean();
}
}
启动类
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringBeanLifeCycleApplication.class, args);
LifeCycleBean bean = run.getBean(LifeCycleBean.class);
System.out.println(bean.getName());
run.close();
}
结果
c.e.b.b.AllLifeCycleBeanPostProcessor : postProcessBeforeInstantiation执行了
c.example.beanLifeCycle.LifeCycleBean : 对象被创建了
c.e.b.b.AllLifeCycleBeanPostProcessor : postProcessAfterInstantiation执行了
c.e.b.b.AllLifeCycleBeanPostProcessor : postProcessProperties执行了
c.example.beanLifeCycle.LifeCycleBean : BeanNameAware接口的setBeanName方法执行了lifeCycleBean
c.example.beanLifeCycle.LifeCycleBean : BeanClassLoaderAware接口的setBeanClassLoader方法执行了 jdk.internal.loader.ClassLoaders$AppClassLoader@36baf30c
c.example.beanLifeCycle.LifeCycleBean : BeanFactoryAware接口的setBeanFactory方法执行了 class org.springframework.beans.factory.support.DefaultListableBeanFactory
c.example.beanLifeCycle.LifeCycleBean : ApplicationContextAware接口的setApplicationContext方法执行了 class org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
c.e.b.b.AllLifeCycleBeanPostProcessor : postProcessBeforeInitialization执行了
c.example.beanLifeCycle.LifeCycleBean : @PostConstruct注解的init方法执行了
c.example.beanLifeCycle.LifeCycleBean : InitializingBean接口的afterPropertiesSet方法执行了
c.example.beanLifeCycle.LifeCycleBean : init-method方法执行了
c.e.b.b.AllLifeCycleBeanPostProcessor : postProcessAfterInitialization执行了
qyh
c.example.beanLifeCycle.LifeCycleBean : @PreDestroy注解的destroy方法执行了
c.example.beanLifeCycle.LifeCycleBean : destroy-method方法执行了
3、总结
1. 实例化(Instantiation)
-> InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
-> constructor
-> InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
2. 属性赋值(polulate)
-> InstantiationAwareBeanPostProcessor#postProcessProperties
3. 初始化(Initialization)
-> invokeAwareMethods
-> setBeanName
-> setBeanClassLoader
-> setBeanFactory
-> ApplicationContextAwareProcessor#postProcessBeforeInitialization#invokeAwareInterfaces
-> setEnvironment
-> setEmbeddedValueResolver
-> setResourceLoader
-> setApplicationEventPublisher
-> setMessageSource
-> setApplicationStartup
-> setApplicationContext
-> BeanPostProcessor#postProcessBeforeInitialization
-> @PostConstruct
-> afterPropertiesSet
-> initMethod
-> BeanPostProcessor#postProcessAfterInitialization
4. 销毁(Destruction)
-> @PreDestroy
-> destroy-method
具体执行流程,可以参考上面的代码,添加断点debug就行。