2月19日

ApplicationContextInitializer

SpringBoot 框架在设计之初,为了有更好的兼容性,在不同的运行阶段,提供了非常多的可扩展点,可以让程序员根据自己的需求,在整个Spring应用程序运行过程中执行程序员自定义的代码ApplicationContextInitializer就是众多扩展点中的一个扩展点

执行时机

ApplicationContextInitializer在IOC容器对象创建完成后执行,可以对上下文环境做一些操作,例如运行环境属性注册等

使用

1.自定义类,实现ApplicationContextInitializer接口

public class MyApplicationcontextInitializer implements ApplicationContextInitializer {//ioc容器对象创建完毕后执行@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {//给上下文context对象注入环境属性//1.准备属性Map<String, Object> protMap = new HashMap<>();protMap.put("applicationName","chessman");//2.获取一个属性资源管理对象//获取的环境独享ConfigurableEnvironment environment = applicationContext.getEnvironment();//属性资源管理对象MutablePropertySources propertySources = environment.getPropertySources();//3.注册propertySources.addLast(new MapPropertySource("proMap",protMap));}
}

2.在META-INF/spring.factories配置文件中配置自定义的类

#接口全路径名称=自定义类的全路径名称 自动补全路径:ctrl+alt+空格
org.springframework.context.ApplicationContextInitializer = com.cacb.initializer.MyApplicationcontextInitializer

最后在启动类中测试一下

@SpringBootApplication
public class APP {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(APP.class, args);String applicationName = context.getEnvironment().getProperty("applicationName");System.out.println(applicationName);}
}

执行结果:

 

可以看到,我们写的application方法已经得到运行

ApplicationListener

监听容器发布的事件,允许程序员执行自己的代码,完成事件驱动开发,它可以监听容器初始化完成、初始化失败等事件。通常情况下可以使用监听器加载资源,开启定时任务等

使用

1.自定义类,实现ApplicationListener接口

public class MyListener implements ApplicationListener {@Overridepublic void onApplicationEvent(ApplicationEvent event) {//ApplicationEvent event 对应的就是发布的事件,ApplicationReadyEvent成功,ApplicationFailedEvent失败if (event instanceof ApplicationReadyEvent){//容器初始化成功System.out.println("MyListener 容器初始化成功");}if (event instanceof ApplicationFailedEvent){//容器初始化失败System.out.println("MyListener 容器初始化失败");}}
}

2.在META-INF/spring.facoytries配置文件中配置自定义的类

org.springframework.context.ApplicationListener = com.cacb.listener.MyListener

运行启动类,查看容器是否成功初始化

正常情况:

 

在applicationcontextinitializer中通过1/0制造一个异常,再次运行,看容器是否能成功初始化

容器初始化失败,符合上面写的逻辑判断

执行时机

IOC容器发布事件之后执行,通常用于资源加载、定时任务发布等

BeanFactory

Bean容器的根接口,提供Bean对象的创建、配置、依赖注入等功能

 常用实现类

最常见的两个实现:

 ApplicationConfigServletApplicationContext

DefaultListabkeBeanFactory

 

BeanDefinition

用于描述Bean,包括Bean的名称,Bean的属性,Bean的行为,实现的接口,添加的注解等等。Spring中,Bean在创建之前,都需要封装成对应的BeanDefinition,然后根据BeanDefinition进一步创建Bean对象

接口继承体系

 

 

 

BeanFactoryPostProcessor

Bean工厂后置处理器,当BeanFactory准备好了以后(Bean初始化之前),会调用该接口i的postProcessBeanFactory方法,经常用于新增BeanDefinition

使用

自定义类实现BeanFactoryPostProcessor接口,在其中注册BeanDefinition

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {//当BeanFactory被实例化好后(Bean创建之前),回调这个函数,注册一些BeanDefinition@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {//注册一个people的BeanDifinitiomGenericBeanDefinition gbdf = new GenericBeanDefinition();gbdf.setBeanClass(people.class);//向下强转DefaultListableBeanFactory dbf = (DefaultListableBeanFactory) beanFactory;dbf.registerBeanDefinition("people",gbdf);}
}

Aware

感知接口,Spring提供的一种机制,通过实现该接口,重写方法,可以感知Spring应用程序执行过程中的一些变化。Spring会判断当前的Bean有没有实现Aware接口,如果实现了,会在特定的实际回调接口对应的方法。

使用 

自定义类,继承三个接口,使用@Compent注解来让Spring自动注册该Bean

@Component
public class child implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware {//BeanClassLoaderAware接口的回调方法@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("child setBeanClassLoader  "+classLoader);}//BeanFactoryAware接口的回调方法@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("child setBeanFactory  "+beanFactory);}//BeanNameAware接口的回调方法@Overridepublic void setBeanName(String name) {System.out.println("child setBeanName  "+name);}
}

InitializingBean/DisposableBean

初始化接口,当Bean被实例化好后,会回调里面的函数,经常用于做一些加载资源的工作

销毁接口,当Bean被销毁之前,会回调里面的函数,经常用于做一些资源释放的工作

使用

自定义类,继承两个接口,重写相关方法,使用@Compent注解来让Spring自动注册该Bean

@Component
public class student implements InitializingBean , DisposableBean {//销毁方法@Overridepublic void destroy() throws Exception {System.out.println("student     destroy");}//初始化方法@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("student    afterPropertiesSet");}
}

 也可以用@PostConstruct和@PreDestroy两个注解来书写初始化和销毁方法,且如果注解对应方法和实现的接口方法同时存在,会先运行注解对应的方法,再运行实现的接口方法(初始化和销毁时都是)

    @PostConstructpublic void init(){System.out.println("student    PostConstruct");}@PreDestroypublic void destroy_method(){System.out.println("student    destroy_method");}
 

BeanPostProcessor

Bean的后置处理器,当Bean对象初始化之前及初始化之后,会回调该接口对应的方法,两个方法如下:

postProcessBeforeInitialization: Bean对象初始化之前调用

postProcessAfterInitialization: Bean对象初始化之后调用

使用

自定义类,实现BeanPostProcessor接口,重写 两个方法,通过@Componet将其交给IOC容器

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {//初始化之前调用@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("MyBeanPostProcessor---BeforeInitialization---"+beanName);return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);}//初始化之后调用@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("MyBeanPostProcessor---AfterInitialization---"+beanName);return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贪心+堆维护,HDU1789Doing Homework again

一、题目 1、题目描述 Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will reduc…

【深蓝学院】移动机器人运动规划--第5章 最优轨迹生成--笔记

文章目录 1. Preliminaries2. Multicopter dynamics and differential flatness&#xff08;多旋翼动力学和微分平坦特性&#xff09;2.1 Differential Flatness2.2 具体建模2.3 Flatness Transformation的解析推导 3. Trajectory Optimization轨迹优化3.1 Problem formulation…

C++学习Day06之继承中的同名成员处理

目录 一、程序及输出1.1 同名成员变量1.2 同名成员函数 二、分析与总结 一、程序及输出 1.1 同名成员变量 #include<iostream> using namespace std;class Base { public:Base(){this->m_A 10;}void func(){cout << "Base中的func调用" << e…

“利用电子医院记录,针对急性护理环境中的老年人,开发并验证了一项医院脆弱风险评分:一项观察性研究“

总结 背景 年长者在全球范围内成为医疗保健的增长用户。我们的目标是确定是否可以利用常规收集的数据来识别具有虚弱特征并面临不利健康结果风险的年长者。 方法 使用三步方法开发和验证了一种医院脆弱风险评分&#xff0c;该评分基于《国际疾病和相关健康问题统计分类第十次修…

摆(行列式、杜教筛)

有一个 n n n\times n nn 的矩阵 A A A&#xff0c;满足&#xff1a; A i , j { 1 i j 0 i ̸ j ∧ i ∣ j C otherwise A_{i,j}\begin{cases} 1 &ij\\ 0 &i\notj\land i\mid j\\ C &\text{otherwise} \end{cases} Ai,j​⎩ ⎨ ⎧​10C​ijij∧i∣jotherwi…

FPGA时钟资源与设计方法——时钟抖动(jitter)、时钟偏斜(skew)概念讲解

目录 1时钟抖动&#xff08; clock jitter&#xff09;2 时钟偏斜&#xff08;clock skew&#xff09; 1时钟抖动&#xff08; clock jitter&#xff09; 时钟抖动&#xff08;Jitter&#xff09;&#xff1a;时钟抖动指的是时钟周期的不稳定性&#xff0c;即&#xff1a;时钟…

Milvus向量库安装部署

GitHub - milvus-io/milvus-sdk-java: Java SDK for Milvus. 1、安装Standstone 版本 参考&#xff1a;Linux之milvus向量数据库安装_milvus安装-CSDN博客 参考&#xff1a;Install Milvus Standalone with Docker Milvus documentation 一、安装步骤 1、安装docker docke…

使用八爪鱼爬取京东商品详情页数据

文章目录 一、前述1.1、采集场景1.2、采集字段1.3、采集结果1.4、采集工具 二、采集步骤2.1、登录网站2.1.1、登录入口2.1.2、京东账号登录2.1.3、登录完成 2.2、自动识别2.3、选取爬取的内容2.4、处理数据2.4.1、纵向字段布局2.4.2、更多字段操作2.4.3、格式化数据2.4.4、添加…

OpenAI最新模型Sora到底有多强?眼见为实的真实世界即将成为过去!

文章目录 1. 写在前面2. 什么是Sora&#xff1f;3. Sora的技术原理 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感…

@ 代码随想录算法训练营第7周(C语言)|Day42(动态规划)

代码随想录算法训练营第7周&#xff08;C语言&#xff09;|Day42&#xff08;动态规划&#xff09; Day42、动态规划&#xff08;包含题目 416. 分割等和子集 &#xff09; 416. 分割等和子集 题目描述 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集&…

导出Excel,支持最佳

列表信息导出为Excel文件&#xff0c; 依赖pom&#xff1a; Sheet, Row:<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId> </dependency>XSSFWorkbook <dependency><groupId>org.apache.poi</…

Rust-所有权(ownership)

文章目录 前言一、管理计算机内存的方式所有权规则 二、Rust中的 moveCopy trait 三、Rust中的 clone总结 前言 Rust入门学习系列-Rust 的核心功能&#xff08;之一&#xff09;是 所有权&#xff08;ownership&#xff09;。引入这个概念是为了更好的管理计算机的内存。下面篇…

【0260】pg_filenode.map文件分析(内含map文件读取、解析demo)

1. 关于pg内核map file map文件是关键数据:我们没有从丢失或损坏中恢复的自动方法。我们使用CRC来检测损坏。为了最小化更新失败的风险, map文件应该保持在不超过一个标准大小的磁盘扇区(即512字节(bytes)),并且我们使用就地覆盖而不是玩重命名游戏。 下面的结构布局被设…

【动态规划】【组合数学】1866. 恰有 K 根木棍可以看到的排列数目

作者推荐 【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II 本文涉及知识点 动态规划汇总 LeetCode1866. 恰有 K 根木棍可以看到的排列数目 有 n 根长度互不相同的木棍&#xff0c;长度为从 1 到 n 的整数。请你将这些木棍排成一排&#xff0c;并满足从左侧 可以…

Yii2项目使用composer异常记录

问题描述 在yii2项目中&#xff0c;使用require命令安装依赖时&#xff0c;出现如下错误提示 该提示意思是&#xff1a;composer运行时&#xff0c;执行了yiisoft/yii2-composer目录下的插件&#xff0c;但是该插件使用的API版本是1.0&#xff0c;但是当前的cmposer版本提供的…

Rust语言之sha-256爆破

文章目录 一、实现Sha-256加密1.创建项目2.编写Cargo.toml文件3.编写程序代码 二、sha256爆破1.获取命令行参数2.读取文件3.校验输入参数4.暴力破解 一、实现Sha-256加密 SHA-256是一种安全哈希算法&#xff0c;主要特点是将输入的数据&#xff08;无论长度&#xff09;通过特定…

Jmeter的自动化测试实施方案(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jmeter是目前最流行的一种测试工具&#xff0c;基于此工…

如何在 Angular 中使用懒加载路由

简介 延迟加载 是一种限制加载用户当前需要的模块的方法。这可以提高应用程序的性能并减小初始捆绑包大小。 默认情况下&#xff0c;Angular 使用 急切加载 来加载模块。这意味着在应用程序运行之前必须加载所有模块。虽然这对许多用例可能是足够的&#xff0c;但在某些情况下…

Pdoc:生成优雅Python API文档的工具

Pdoc&#xff1a;生成优雅Python API文档的工具 在开发Python项目时&#xff0c;文档是至关重要的。它不仅提供了对代码功能和用法的了解&#xff0c;还为其他开发人员提供了参考和使用的便利。Pdoc是一个流行的文档生成工具&#xff0c;专为生成Python API文档而设计。本文将介…

【NextJS】整个项目跨域配置

项目跨域是指&#xff1a;本项目作为被访问方&#xff0c;由另一个项目对本项目发起fetch等动作获取数据页面数据 实验环境&#xff1a; next: 14.1.0react: ^18 配置文件&#xff1a;next.config.[mjs|js|ts] 假定原始范本内容&#xff1a; /** type {import(next).NextCon…