springboot-bean生命周期

1.spring bean生命周期

spring bean生命周期

2.Aware接口

2.1.作用

一个标记,标记在spring容器初始化时需要获取上下文中当前的一些运行环境;

2.2.常用接口

  • ApplicationContextAware:获取ApplicationContext spring上下文;
  • ApplicationEventPublisherAware:获取ApplicationEventPublisher事件发布器;
  • BeanClassLoaderAware:获取当前的ClassLoader类加载器;
  • BeanFactoryAware:获取BeanFactory bean工厂;
  • BeanNameAware:获取bean的名称;
  • EnvironmentAware:获取Environment当前环境变量;
  • ImportAware:获取AnnotationMetadata注解元数据,需要与@Import注解配合使用,感觉功能与ImportSelector接口类似;
  • NotificationPublisherAware:获取NotificationPublisherJMX通知发布器;
  • ServletContextAware:获取ServletContext servlet上下文;

3.IOC扩展点

  • 作用:允许在spring对bean进行声明、注册 、实例化(Instantiation)、初始化(Initialization)和销毁的各个阶段,添加自定义的处理逻辑;

3.1.BeanFactoryPostProcessor接口

  • BeanFactory处理器。这时Bean已经注册,但还未创建,一般在这里修改Bean的属性;
/**
 *********************************************************
 ** @desc  : BeanFactoryPostProcessor示例
 **          BeanFactory扩展点,BeanFactory的后处理器。Bean已经注册,还没有创建,一般在这里修改Bean的属性
 ** @author  Pings
 ** @date    2020/7/25
 ** @version v1.0
 * *******************************************************
 */
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        //**获取user的BeanDefinition
        BeanDefinition beanDefinition = beanFactory.getBeanDefinition("user");
        //**获取user的属性
        MutablePropertyValues pv = beanDefinition.getPropertyValues();
        //**修改user的age属性
        pv.addPropertyValue("age", 88);
        //**设置为单例
        beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
    }
}

3.2.BeanDefinitionRegistryPostProcessor接口

  • BeanFactory处理器的子接口,会在BeanFactoryPostProcessor之前调用。这时所有BeanDefinition已经被加载;一般在这里注册Spirng无法自动注册的bean,比如第三方的bean;
/**
 *********************************************************
 ** @desc  : BeanDefinitionRegistryPostProcessor示例
 **           Bean注册处理器,BeanFactoryPostProcessor子接口。Bean已经注册,还没有创建,一般在这里注册的bean
 ** @author  Pings
 ** @date    2020/7/25
 ** @version v1.0
 * *******************************************************
 */
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    //**注册MyClass对象
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        //**创建一个Bean
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(MyClass.class);
        //**设置班级名称
        builder.addPropertyValue("name", "118班");
        //**设置可通过@Autowire注解引用
        builder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME);
        //**注册到BeanDefinitionRegistry
        registry.registerBeanDefinition("myClass", builder.getBeanDefinition());
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        //**与BeanFactoryPostProcessor相同
    }
}

3.3.BeanPostProcessor接口

  • Bean初始化处理器,包括前置处理器和后置处理器,在bean初始化前后定义处理逻辑,这时Bean已经创建;
/**
 *********************************************************
 ** @desc  : BeanPostProcessor示例
 **           Bean初始化处理器,包括前置处理器和后置处理器,在bean初始化前后定义处理逻辑,这时Bean已经创建
 ** @author  Pings
 ** @date    2020/7/27
 ** @version v1.0
 * *******************************************************
 */
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    //**初始化前置处理器,调用User的setName方法,修改User的name属性
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if(beanName.equals("user")) {
            System.out.println("初始化User前...");
            User entity = (User) bean;
            entity.setName("pings");
        }
        return bean;
    }

    //**初始化后置处理器
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if(beanName.equals("user")) System.out.println("初始化User后...");
        return bean;
    }
}

3.4.InstantiationAwareBeanPostProcessor接口

  • 实例化处理器,BeanPostProcessor初始化处理器的子接口,会在BeanPostProcessor之前调用。包括前置处理器和后置处理器,在bean实例化前后定义处理逻辑。前置处理时,已经注册,还未创建;后置处理时,已经创建;
/**
 *********************************************************
 ** @desc  : InstantiationAwareBeanPostProcessor示例
 **           实例化处理器,BeanPostProcessor初始化处理器的子接口,会在BeanPostProcessor之前调用
 **           包括前置处理器和后置处理器,在bean实例化前后定义处理逻辑
 **           前置处理时,已经注册,还未创建;后置处理时,已经创建
 ** @author  Pings
 ** @date    2020/7/28
 ** @version v1.0
 * *******************************************************
 */
@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

    /**
     * 实例化前置处理器,返回指定类的实例化对象,可在此处修改指定类在spring容器中的实例化对象
     * 返回值为null则创建指定类的默认实例
     * 返回值不为null则把返回值当做指定类的实例:
     *   1.跳过postProcessAfterInstantiation(实例化后置处理器)
     *   2.跳过postProcessBeforeInitialization(初始化前置处理器)
     *   3.执行postProcessAfterInitialization(初始化后置处理器)
     */
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        //**用Subject1的子类Subject2的实例替换Subject1的实例
        if(beanClass.equals(Subject1.class)) {
            System.out.println("实例化Subject1前...");
            return new Subject2();
        }

        return null;
    }

    //**实例化后置处理器
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return true;
    }

    /**
     * 修改对象属性值,这时属性值还未设置到对象中
     * 在postProcessAfterInstantiation()后调用,postProcessAfterInstantiation如果返回false,则会跳过此方法
     */
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        return pvs;
    }
}

3.5.SmartInstantiationAwareBeanPostProcessor接口

  • 智能实例化处理器,InstantiationAwareBeanPostProcessor实例化处理器的子接口;
//**SmartInstantiationAwareBeanPostProcessor示例,InstantiationAwareBeanPostProcessor实例化处理器的子接口
public interface SmartInstantiationAwareBeanPostProcessor {

    //**预测bean类型
    default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }

    //**选择合适的构造器
    default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }

    //**获取提前暴露的bean引用,用来支持单例对象的循环引用
    default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

3.6.MergedBeanDefinitionPostProcessor接口

  • 合并Bean定义后置处理器,BeanPostProcessor初始化处理器的子接口;
//**合并BeanDefinition后置处理器,BeanPostProcessor初始化处理器的子接口
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {

    //**bean实例化后调用,可修改merged BeanDefinition的属性或者缓存元数据
    void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);

    //**重置bean定义后的通知,此处应清除Bean的元数据
    default void resetBeanDefinition(String beanName) {
    }
}

3.7.DestructionAwareBeanPostProcessor接口

  • 对象销毁处理器,BeanPostProcessor初始化处理器的子接口;
public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {

    //**对象销毁处理
    void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;

    //**是否处理对象销毁
    default boolean requiresDestruction(Object bean) {
        return true;
    }
}

4.bean初始化/销毁

4.1.作用

  • 在某个bean初始化/销毁时添加自定义的处理逻辑;

4.2.方法

  • 接口:InitializingBean/DisposableBean接口定义初始化/销毁的方法;
  • 配置:init-method/destroy-method属性定义初始化/销毁的方法;
  • 注解:@PostConstruct/@PreDestroy定义初始化/销毁的方法;
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页