1.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 {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {//**获取user的BeanDefinitionBeanDefinition 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对象@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {//**创建一个BeanBeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(MyClass.class);//**设置班级名称builder.addPropertyValue("name", "118班");//**设置可通过@Autowire注解引用builder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME);//**注册到BeanDefinitionRegistryregistry.registerBeanDefinition("myClass", builder.getBeanDefinition());}@Overridepublic 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属性@Overridepublic 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;}//**初始化后置处理器@Overridepublic 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(初始化后置处理器)*/@Overridepublic 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;}//**实例化后置处理器@Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {return true;}/*** 修改对象属性值,这时属性值还未设置到对象中* 在postProcessAfterInstantiation()后调用,postProcessAfterInstantiation如果返回false,则会跳过此方法*/@Overridepublic 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定义初始化/销毁的方法;

springboot-bean生命周期相关推荐

  1. springboot bean生命周期

    对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制. Spring IoC容器托管对象的be ...

  2. SpringBoot:Bean生命周期介绍

    SpringBoot:Bean生命周期介绍 前言 一.Bean 的生命周期介绍 二.具体操作顺序 前言 Bean 是 SpringBoot 中一个非常重要的组成部分,是面试中经常会问到的一个问题. 本 ...

  3. springboot学习:bean生命周期

    1.bean 生命周期 bean创建-初始化-销毁 构造(对象创建): 单实例:在容器启动的时候创建对象; 多实例:在每次获取的时候创建对象: 初始化: 对象创建完成,并赋值好,调用初始化方法 销毁: ...

  4. Spring Bean生命周期: Bean的实例化

    [Spring Bean 生命周期系列]传送门 1.Spring Bean生命周期: Bean元信息的配置与解析阶段 2.Spring Bean生命周期: Bean的注册 3.Spring Bean生 ...

  5. Spring Bean生命周期:Bean的初始化阶段

    [Spring Bean 生命周期系列]传送门 1.Spring Bean生命周期: Bean元信息的配置与解析阶段 2.Spring Bean生命周期: Bean的注册 3.Spring Bean生 ...

  6. spring一: 容器以及bean生命周期

    spring框架的几个优点: 1. 轻量级  2. 针对接口编程,解耦合   3. aop编程   4. 方便集成各种优秀框架  5.非侵入式   6.容器 IOC(Inversion of Cont ...

  7. 【Spring】- Bean生命周期

    2019独角兽企业重金招聘Python工程师标准>>> Spring Bean的生命周期: bean对象实例化 属性注入 beanfactory ApplicationContext ...

  8. Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02

    文章目录 Pre 通俗流程 finishBeanFactoryInitialization Pre Spring5源码 - 06 Spring Bean 生命周期流程 概述 01 接上文 通俗流程 下 ...

  9. Spring5源码 - 06 Spring Bean 生命周期流程 概述 01

    文章目录 Bean生命周期概述 Demo finishBeanFactoryInitialization(beanFactory) 核心流程 Bean生命周期概述 说到Spring Bean的生命周期 ...

  10. Spring学习笔记八--Bean生命周期和后置处理器

    为什么80%的码农都做不了架构师?>>>    Bean生命周期和后置处理器 IOC容器的bean生命周期 1.构造器或工厂方法建立bean实例 2.bean属性赋值,引用其他bea ...

最新文章

  1. php 类中的各种拦截器
  2. H.264编码profile level控制
  3. 先锋展示了可爱鸟形车载机器
  4. 3- 快速上手Linux玩转典型应用- Linux准备工作
  5. linux中sed命令用例,Linux中使用sed命令或awk命令修改常规配置文件
  6. Redis与Java - 实践
  7. 使用POI读写word docx文件
  8. PuTTY/PSCP、PSFTP介绍及使用
  9. git之windows下创建.gitignore文件
  10. 基于python的-使用正则表达式验证手机号
  11. 【离散数学】集合论 第三章 集合与关系(6) 二元关系的定义、表示和运算及性质
  12. 模拟电路与数字电路基础知识点总结
  13. Eclipse Android开发环境搭建
  14. css3 箭头动态效果,CSS3制作上下跳动动画箭头效果
  15. ycf 梗_抖音三个汤勺放在筷子上是什么梗 抖音三个汤勺放在筷子上出处介绍[多图]...
  16. ZOJ1516HDU1507(二分图匹配)
  17. 因为Windows防火墙服务未运行,不能正常使用
  18. 遇到网页无法复制文本怎么办,程序员来教你一键解锁,不需要任何软件和插件
  19. #计算机应用与技巧分享 #应用推荐 #录屏 Captura 免费开源的屏幕录制工具
  20. 如何使用iTunes与iTools导出微信聊天记录

热门文章

  1. python爬虫小说实例源码_Python下载网络小说实例代码
  2. OsiriX User Manual - 3D Curved MPR(曲面重建)
  3. Linux中c语言strcmp,c语言常用函数strcmp函数和strcpy函数
  4. RestClient操作索引库
  5. ECSHOP图书销售网站模板
  6. 2.11 数值分析: 事后误差估计和迭代改善
  7. jvisualvm监控本地jvm
  8. java.util.LinkedHashMap cannot be cast to
  9. cat3 utp是不是网线_CAT网线品种分类
  10. cat6 万兆_超六类屏蔽网线CAT6AF/FTP10G万兆过测试工程网线益朗通信科技冀州