springboot-bean生命周期
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生命周期相关推荐
- springboot bean生命周期
对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制. Spring IoC容器托管对象的be ...
- SpringBoot:Bean生命周期介绍
SpringBoot:Bean生命周期介绍 前言 一.Bean 的生命周期介绍 二.具体操作顺序 前言 Bean 是 SpringBoot 中一个非常重要的组成部分,是面试中经常会问到的一个问题. 本 ...
- springboot学习:bean生命周期
1.bean 生命周期 bean创建-初始化-销毁 构造(对象创建): 单实例:在容器启动的时候创建对象; 多实例:在每次获取的时候创建对象: 初始化: 对象创建完成,并赋值好,调用初始化方法 销毁: ...
- Spring Bean生命周期: Bean的实例化
[Spring Bean 生命周期系列]传送门 1.Spring Bean生命周期: Bean元信息的配置与解析阶段 2.Spring Bean生命周期: Bean的注册 3.Spring Bean生 ...
- Spring Bean生命周期:Bean的初始化阶段
[Spring Bean 生命周期系列]传送门 1.Spring Bean生命周期: Bean元信息的配置与解析阶段 2.Spring Bean生命周期: Bean的注册 3.Spring Bean生 ...
- spring一: 容器以及bean生命周期
spring框架的几个优点: 1. 轻量级 2. 针对接口编程,解耦合 3. aop编程 4. 方便集成各种优秀框架 5.非侵入式 6.容器 IOC(Inversion of Cont ...
- 【Spring】- Bean生命周期
2019独角兽企业重金招聘Python工程师标准>>> Spring Bean的生命周期: bean对象实例化 属性注入 beanfactory ApplicationContext ...
- Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02
文章目录 Pre 通俗流程 finishBeanFactoryInitialization Pre Spring5源码 - 06 Spring Bean 生命周期流程 概述 01 接上文 通俗流程 下 ...
- Spring5源码 - 06 Spring Bean 生命周期流程 概述 01
文章目录 Bean生命周期概述 Demo finishBeanFactoryInitialization(beanFactory) 核心流程 Bean生命周期概述 说到Spring Bean的生命周期 ...
- Spring学习笔记八--Bean生命周期和后置处理器
为什么80%的码农都做不了架构师?>>> Bean生命周期和后置处理器 IOC容器的bean生命周期 1.构造器或工厂方法建立bean实例 2.bean属性赋值,引用其他bea ...
最新文章
- php 类中的各种拦截器
- H.264编码profile level控制
- 先锋展示了可爱鸟形车载机器
- 3- 快速上手Linux玩转典型应用- Linux准备工作
- linux中sed命令用例,Linux中使用sed命令或awk命令修改常规配置文件
- Redis与Java - 实践
- 使用POI读写word docx文件
- PuTTY/PSCP、PSFTP介绍及使用
- git之windows下创建.gitignore文件
- 基于python的-使用正则表达式验证手机号
- 【离散数学】集合论 第三章 集合与关系(6) 二元关系的定义、表示和运算及性质
- 模拟电路与数字电路基础知识点总结
- Eclipse Android开发环境搭建
- css3 箭头动态效果,CSS3制作上下跳动动画箭头效果
- ycf 梗_抖音三个汤勺放在筷子上是什么梗 抖音三个汤勺放在筷子上出处介绍[多图]...
- ZOJ1516HDU1507(二分图匹配)
- 因为Windows防火墙服务未运行,不能正常使用
- 遇到网页无法复制文本怎么办,程序员来教你一键解锁,不需要任何软件和插件
- #计算机应用与技巧分享 #应用推荐 #录屏 Captura 免费开源的屏幕录制工具
- 如何使用iTunes与iTools导出微信聊天记录
热门文章
- python爬虫小说实例源码_Python下载网络小说实例代码
- OsiriX User Manual - 3D Curved MPR(曲面重建)
- Linux中c语言strcmp,c语言常用函数strcmp函数和strcpy函数
- RestClient操作索引库
- ECSHOP图书销售网站模板
- 2.11 数值分析: 事后误差估计和迭代改善
- jvisualvm监控本地jvm
- java.util.LinkedHashMap cannot be cast to
- cat3 utp是不是网线_CAT网线品种分类
- cat6 万兆_超六类屏蔽网线CAT6AF/FTP10G万兆过测试工程网线益朗通信科技冀州