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,一经查实,立即删除!

相关文章

【深蓝学院】移动机器人运动规划--第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;该评分基于《国际疾病和相关健康问题统计分类第十次修…

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逆向感…

【动态规划】【组合数学】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版本提供的…

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

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

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

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

扯淡的DevOps,我们开发根本不想做运维!

引言 最初考虑引用“ DevOps 已死&#xff0c;平台工程才是未来”作为标题&#xff0c;但这样的表达可能太过于绝对。最终&#xff0c;决定用了“扯淡的”这个词来描述 DevOps&#xff0c;但这并不是一种文明的表达方式。 文章旨在重新审视 DevOps 和平台工程&#xff0c;将分别…

【c语言】人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏&#xff1a; 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时…

什么台灯最好学生晚上用的?五大高口碑学生护眼台灯推荐

对于学生来说&#xff0c;晚上学习早已是家常便饭&#xff0c;其中如果光线不合适&#xff0c;很容易就会造成近视的情况。面对这样的商机&#xff0c;很多厂家纷纷涉足护眼台灯行业&#xff0c;无论技术成熟与否&#xff0c;都大打护眼卖点&#xff0c;其中难免含有大量水分。…

SpringMVC的执行流程

过去的开发中,视图阶段&#xff08;老旧JSP等&#xff09; 1.首先用户发送请求到前端控制器DispatcherServlet(这是一个调度中心) 2.前端控制器DispatcherServlet收到请求后调用处理器映射器HandlerMapping 3.处理器映射器HandlerMapping找到具体的处理器,可查找xml配置或注…

milvus insert api的数据结构源码分析

insert api的数据结构 一个完整的insert例子: import numpy as np from pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )num_entities, dim 10, 3print("start connecting to Milvus") connections.connect("default&q…

网络原理 - HTTP/HTTPS(2)

HTTP请求 认识URL URL基本格式 平时我们俗称的"网址"其实就是说的URL(Uniform Resource Locator统一资源定位符). (还有一个唯一资源标识符,称为uri,严格来说,uri范围比url广). 互联网上的每一个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该…

HTB-Analytics

靶机的IP地址为10.10.11.233&#xff0c;攻击机的IP地址为10.10.16.30 信息收集 # nmap -sT --min-rate 10000 -p- 10.10.11.233 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-19 14:50 CST Warning: 10.10.11.233 giving up on port because retransm…

十字星K线(Doji)含义,fpmarkets澳福一分钟讲解

许多新手交易者遇到过这种奇怪的烛台&#xff0c;看起来就像一个十字架&#xff0c;没有主体上下有长长的影子&#xff0c;fpmarkets澳福肯定的告诉各位投资者&#xff0c;这种就是十字星K线(用Doji表示)&#xff0c;开盘价与收盘价一致&#xff0c;价格运动已经停止时出现在烛…

突发!某地区网络故障,格行随身WiFi成“救星”?现场直击!

近日&#xff0c;某地区突发网络故障&#xff0c;导致大量用户无法上网。然而&#xff0c;在这场网络危机中&#xff0c;一款名为“格行随身WiFi”的设备却意外走红&#xff0c;成为了当地的“网络救星”。究竟发生了什么&#xff1f;让我们一起来现场直击&#xff01; 据了解&…

Leetcode刷题笔记题解(C++):120. 三角形最小路径和

思路&#xff1a;动态规划&#xff0c;去生成一个对应的当前节点的最小路径值&#xff0c;对应的关系如下所示 dp[0][0] triangle[0][0] dp[i][0] triangle[i][0]dp[i-1][0] dp[i][i] triangle[i][i]dp[i-1][i] dp[i][j] triangle[i][j]min(dp[i-1][j-1],dp[i-1][j]) …