【Spring源码解析】 - 生命周期

1 Bean初始化、销毁

1.1 @Bean注解

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
   
   @AliasFor("name")
   String[] value() default {};
   
   @AliasFor("value")
   String[] name() default {};
  
   Autowire autowire() default Autowire.NO;
  
   /**
    * Bean的初始化方法
    */
   String initMethod() default "";
   
  /**
   *  Bean的销毁方法
   */
   String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
}

1.2 案例

(1)、Student

/**
* @Description:
* @Auther: zhurongsheng
* @Date: 2020/2/27 21:14
*/
public class Student {


    public Student(){
        System.out.println("Student   Construct");
    }


    public void  init(){
        System.out.println("Student   init");
    }


    public void destroy(){
        System.out.println("Student   destroy");
    }
}

(2)、配置文件


 /**
* @Description:
* @Auther: zhurongsheng
* @Date: 2020/2/27 21:11
*/
@Configuration
public class SpringConfig {
    /**
     *initMethod:bean的初始化方法
     *destroyMethod: bean的销毁方法
     */
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Student student(){
        return new Student();
    }
}

(3)、运行类


public class SpringApplicationContext {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(SpringConfig.class);
        applicationContext.close();
    }
}

(4)、结果
【Spring源码解析】 - 生命周期_第1张图片

2 BeanPostProcessor

2.1、作用

/**
*  BeanPostProcessor 用于增强Bean
*/
public interface BeanPostProcessor {
   
   /**
    * 在Bean的init方法之前调用
    */
   @Nullable
   default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
      return bean;
   }
    
   /**
    * 在Bean的init方法之后调用
    */
   @Nullable
   default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      return bean;
   }
}

2.2、案例

(1)、创建 ZrsBeanPostProcessor

/**
* @Description: bean增强类
* @Auther: zhurongsheng
* @Date: 2020/2/27 21:24
*/
public class ZrsBeanPostProcessor implements BeanPostProcessor {
    /**
     * 功能描述 Bean的前置处理器
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + ":Bean的前置处理器");
        return bean;
    }
    /**
     * 功能描述 Bean的后置处理器
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + ":Bean的后置处理器");
        return bean;
    }
}

(2)、修改配置文件,把ZrsBeanPostProcessor加入到IOC中

/**
* @Description:
* @Auther: zhurongsheng
* @Date: 2020/2/27 21:11
*/ 
 @Configuration
@Import(ZrsBeanPostProcessor.class)
public class SpringConfig {
  
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Student student(){
        return new Student();
    }
}

(3)、 运行类

public class SpringApplicationContext {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(SpringConfig.class);
        applicationContext.close();
    }
}

【Spring源码解析】 - 生命周期_第2张图片

3、跟踪源码查看Student创建过程

3.1、AnnotationConfigApplicationContext 构造方法
【Spring源码解析】 - 生命周期_第3张图片
3.2、AbstractApplicationContext refresh方法
【Spring源码解析】 - 生命周期_第4张图片

3.3、AbstractApplicationContext finishBeanFactoryInitialization
【Spring源码解析】 - 生命周期_第5张图片
3.4、DefaultListableBeanFactory preInstantiateSingletons()
【Spring源码解析】 - 生命周期_第6张图片
3.5、AbstractBeanFactory doGetBean ,打断点找到name为Student的Bean
【Spring源码解析】 - 生命周期_第7张图片
【Spring源码解析】 - 生命周期_第8张图片
3.6、调用 AbstractAutowireCapableBeanFactory createBean方法
【Spring源码解析】 - 生命周期_第9张图片
3.7、AbstractAutowireCapableBeanFactory doCreateBean 方法
【Spring源码解析】 - 生命周期_第10张图片
3.8、AbstractAutowireCapableBeanFactory initializeBean 方法
【Spring源码解析】 - 生命周期_第11张图片
3.9、打断点进入Bean的后置处理器
AbstractAutowireCapableBeanFactory applyBeanPostProcessorsAfterInitialization
【Spring源码解析】 - 生命周期_第12张图片

3.10、F5进去
【Spring源码解析】 - 生命周期_第13张图片
3.11、Bean的生命周期如下:
【Spring源码解析】 - 生命周期_第14张图片
3.12、Bean的生命周期时序图
【Spring源码解析】 - 生命周期_第15张图片

你可能感兴趣的:(Spring源码解析与实战)