Spring之Bean的生命周期

126 阅读2分钟

一、Bean的创建

1. 实例化

  • 默认使用该类的无参构造方法,进行实例化;
  • 如果存在多个构造方法,Spring会根据配置推断出一个构造方法进行实例化;

2. 属性赋值(依赖注入)

  • 在实例化之后,Spring 会检查该对象的属性是否需要自动注入;
  • 如添加了 @Autowired@Resource@Value 注解的属性,Spring 会为其注入相应的依赖;
  • Spring拓展点:实现InstantiationAwareBeanPostProcessor,重写postProcessProperties()

3. Aware回调

  • 依赖注入后,Spring会判断该对象是否实现了BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口;
  • 如果实现了,就表示当前对象必须实现该接口中所定义的setBeanName()setBeanClassLoader()setBeanFactory()方法,那Spring就会调用这些方法并传入相应的参数;

4 初始化前

  • Spring拓展点:实现BeanPostProcessor接口,重写postProcessBeforeInitialization方法;
  • Spring会调用当前Bean对象有 @PostConstruct注解的方法;

5 初始化

  • 查看当前Bean对象是否实现了InitializingBean接口;
  • 如果实现了就调用其afterPropertiesSet()方法;

6 初始化后

  • Spring会判断当前对象需不需要进行AOP,如果不需要那么Bean就创建完了,
  • 如果需要进行AOP,则会进行动态代理并生成一个代理对象做为Bean;
  • Spring拓展点:实现BeanPostProcessor接口,重写postProcessAfterInitialization方法:

7. Bean的销毁过程

  • 实现了DisposableBean接口;
public class MyBean implements DisposableBean { 
    @Override 
    public void destroy() throws Exception { 
        System.out.println("销毁方法..."); 
    } 
}
  • 在XML配置文件中,可以通过 bean元素的 destroy-method 属性来指定销毁方法;
<bean id="myBean" class="com.example.MyBean" destroy-method="destroy"/> 
  • 使用 @PreDestroy注解;
public class MyBean { 
    @PreDestroy 
    public void destroy() { 
        System.out.println("销毁方法..."); 
    } 
}
  • 使用 @Bean 注解的 destroyMethod 属性
@Configuration
public class AppConfig {
    @Bean(destroyMethod = "destroy")
    public MyBean myBean() {
        return new MyBean();
    }
}

public class MyBean {
    public void destroy() {
        System.out.println("销毁方法...");
    }
}

二、代码案例

1. MyBean类

@Data
@Component
public class MyBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {

    private String name;

    public MyBean(){
        System.out.println("==》1.实例化:无参构造器执行...");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("==》3.BeanFactoryAware回调");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("==》3.BeanNameAware回调 " );
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("==》3.ApplicationContextAware回调" );
    }

    @PostConstruct
    public void init() {
        System.out.println("==》4.初始化前:@PostConstruct" );
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("==》5.初始化:InitializingBean.afterPropertiesSet");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("==》7.销毁方法:destroy");
    }
}

2. MyBeanPropertiesProcessor类

@Component
public class MyBeanPropertiesProcessor implements InstantiationAwareBeanPostProcessor {

    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        if ("myBean".equals(beanName)) {
            MyBean myBean = (MyBean) bean;
            myBean.setName("李四");
            System.out.println("==》2.属性赋值:InstantiationAwareBeanPostProcessor.postProcessProperties:" + myBean.getName());
        }
        return pvs;
    }
}

3. MyBeanPostProcessor类

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if ("myBean".equals(beanName)) {
            System.out.println("==》4.初始化前:postProcessBeforeInitialization");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if ("myBean".equals(beanName)) {
            System.out.println("==》6.初始化后:postProcessAfterInitialization");
        }
        return bean;
    }

}

4.输出结果

==》1.实例化:无参构造器执行...
==》2.属性赋值:InstantiationAwareBeanPostProcessor.postProcessProperties:李四
==》3.BeanNameAware回调 
==》3.BeanFactoryAware回调
==》3.ApplicationContextAware回调
==》4.初始化前:postProcessBeforeInitialization
==》4.初始化前:@PostConstruct
==》5.初始化:InitializingBean.afterPropertiesSet
==》6.初始化后:postProcessAfterInitialization
==》7.销毁方法:destroy