42.SpringBoot—原理篇

一、SpringBoot原理篇。

(1)自动配置。

(1.1)bean加载方式。

(1.1.1)xml方式。(适用自定义bean与第三方bean) 

(1.1.2)注解方式+组件扫描。(适用于自定义bean)

(1.1.3)@Bean方式+将类定义为bean+组件扫描。(适用自定义bean与第三方bean) 

(1.1.4)@Import。

注意:@Import导入的bean的名称是全路径类名,其他注解只是类名(首字母小写)。 

(1.1.5)使用上下文对象注册bean对象。

注意:AnnotationConfigApplicationContext对象才有注册bean的方法,其他的对象没有。

(1.1.6)导入实现了ImportSelector接口的类,实现对导入源的编程式处理。

@Import(MyImportSelector.class)在SpringConfig6上面,所以SpringConfig6类是MyImportSelector类的元数据。

@Configuration
//@ComponentScan(basePackages = "com.itheima")
@Import(MyImportSelector.class)
public class SpringConfig6 {
}
public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata metadata) {System.out.println("================");System.out.println("提示:"+metadata.getClassName());System.out.println(metadata.hasAnnotation("org.springframework.context.annotation.Configuration"));Map<String, Object> attributes = metadata.getAnnotationAttributes("org.springframework.context.annotation.ComponentScan");System.out.println(attributes);System.out.println("================");//各种条件的判定,判定完毕后,决定是否装在指定的beanboolean flag = metadata.hasAnnotation("org.springframework.context.annotation.Configuration");if(flag){return new String[]{"com.itheima.bean.Dog"};}return new String[]{"com.itheima.bean.Cat"};}
}

 (1.1.7)导入实现了ImportBeanDefinitionRegistrar接口的类。

@Import({BookServiceImpl1.class, MyPostProcessor.class, MyRegistrar2.class, MyRegistrar.class})
public class SpringConfig8 {
}

(1.1.8)导入实现了BeanDefinitionRegistryPostProcessor接口的类。

理解: 等BeanDefinitionRegistry注册完所有bean之后,BeanDefinitionRegistryPostProcessor才会开始执行,如果遇到同名的则会覆盖之前的。

@Import({BookServiceImpl1.class, MyPostProcessor.class, MyRegistrar2.class, MyRegistrar.class})
public class SpringConfig8 {
}

 (1.1.9)创建上下文对象时指定配置类。(该方式等于@Import(xxx.class))

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);

提示:若创建上下文对象的时候不指定该类(即需要被组件扫描发现是配置类),则需加上@Configuration注解声明该类为配置类。

@ComponentScan({"com.itheima.bean","com.itheima.config"})
public class SpringConfig3 {@Beanpublic DogBean dog(){return new DogBean();}
}
public class App3 {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);String[] names = ctx.getBeanDefinitionNames();for (String name : names) {System.out.println(name);}System.out.println(ctx.getBean("dog"));}
}

(1.1.10)FactoryBean接口(制造接口泛型类型的bean,本质@Bean声明,返回是泛型类型)。

 注意:虽然返回是DogFactoryBean类型,但实际上返回的是泛型的类型。(原理暂不清楚)

public class DogFactoryBean implements FactoryBean<Dog> {@Overridepublic Dog getObject() throws Exception {Dog d = new Dog();//.........return d;}@Overridepublic Class<?> getObjectType() {return Dog.class;}@Overridepublic boolean isSingleton() {return true;}
}
@ComponentScan({"com.itheima.bean","com.itheima.config"})
public class SpringConfig3 {//该方法与下面的方法只能存在一个。(因为两个方法返回值都是Dog类型)@Beanpublic DogFactoryBean dog(){return new DogFactoryBean();}//这个返回的是Dog类型(Dog是接口),该方法与下面的方法只能存在一个。(因为两个方法返回值都是Dog类型)
//    @Bean
//    public Dog dog(){
//        return new Dog();
//    }}

提示:传递的泛型是Book,即@Bean出来的实际是Book对象。 

(1.1.11)配置文件+配置类 = 搭配使用。

提示:个人觉得,跟配置文件中注解扫描该配置类,然后上下文对象中指定配置文件是一样的。

ApplicationContext ctx = new ClassPathXmlApplicationContext("SpringConfig2.xml");

(1.1.12)@Configuration注解的不一样。

@Configuration默认创建的是代理对象,在获取代理对象后,调用该对象里面的方法(有@Bean标记的方法)的时候先去IOC容器中获取返回(即得到的都是同一个对象)。

注意:proxyBeanMethods属性默认是ture,如果是false,则不是代理对象。

(1.1.13)小结。

注意:@Import导入的bean的名称是全路径类名,其他注解只是类名(首字母小写)。  

提示:6、7、8这上使用@Import导入实现接口的类,实际该类不会被注册到容器里面,只会注册接口方法中定义的需要被注册到容器的bean。 

(1.2) Bean的加载控制。

(1.2.1)bean加载控制方式。

提示:能够对bean的加载进行控制的基本都是编程式的。


(1.2.2)bean的加载控制(编程式)。

@Import(MyImportSelector.class)
public class SpringConfig {
}

 (1.2.3)bean的加载控制(注解)。 

@ConditionalOnClass(Mouse.class)检测是否存在这个类,其实使用类型没意义,需要使用字符串才不报错。(这是关于项目有没有该类)

@ConditionalOnBean(name = "com.itheima.bean.Mouse")bean名为mouse(使用@Component注解标记),这也满足。(这是在IOC容器中有没有该对象)

@ConditionalOnBean(name = "jerry")则名称必须要相同(使用@Component(“jerry”)标记)。

注意:注解需要导入springboot基本依赖。 

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.5.4</version></dependency>

注意:还可以在类上就行判断是否需要加载为bean: 

@Component("tom")
@ConditionalOnBean(name = "jerry")
//@ConditionalOnWebApplication
@ConditionalOnNotWebApplication
public class Cat {
}

(1.3)bean依赖属性配置(自动配置类的属性配置)。

总结起来就是:如果配置文件中有值则使用,如果没有则使用默认值。 

@EnableConfigurationProperties(CartoonProperties.class) 注解的作用是将 CartoonProperties 类注册为一个 Spring Bean。

(1.4)自动配置原理。 

@Import(AutoConfigurationPackages.Registrar.class):设置启动类所在的包作为扫描包,后续要针对当前的包进行扫描,如果其他starter也是该包名开头,可能也会扫描。(将启动类所在的包进行添加到xxx对象中,xxx对象被注册为bean)@Import(AutoConfigurationImportSelector.class) :将所有的自动配置类(满足条件的自动配置类)注册为bean

原理:将文件中的自动配置类的全路径名全部加载出来,然后进行判断,如果满足则加载(比如依赖中是否有redis的某个类,如果有则加载redis技术相关配置),不满足则不加载。 

该文件中定义了很多技术的类(自动配置类),其实就是下面说的技术集A。 

(1.5)变更自动配置。

(1.5.1)自定义自动配置类。

使用自定义自动配置后,不需要使用@Import(CartoonCatAndMouse.class)就能自动配置。

(1.5.2)排除自动配置类或依赖。 

(2)自定义starter。

自定义starter:做一个独立项目,有自动配置类,最后在META-INF/spring.factories文件中写上自动配置类,然后执行maven的clean,再执行install(将starter添加到本地仓库)。

(2.1)案例:统计独立IP访问次数。

(2.1.1)简陋版ip展示。

下面的模拟调用是导入了该自定义starter的项目,模拟调用上面的都是自定义starter里面的内容,编写好自定义starter后,需要调用maven中的生命周期执行clean,再执行install(安装到本地仓库中,方便其他需要使用该自定义starter的项目在pom中导入该自定义starter,每次修改自定义starter之后都要重写clean+install,确保仓库中是最新版)。

(2.1.2)增加定时任务、属性配置。

(2.1.3)在注解参数值中的字符串中获取bean对象属性值。

注意:如果主项目基础包是com.itheima,starter的也是com.itheima,那么会出现bean不唯一的问题。(自动配置类-第1次(自动配置类导入了该类),扫描的时候-第2次(扫描com.itheima包的时候扫到了该类)) 。

@Component("ipProperties")

@ConfigurationProperties(prefix = "tools.ip")

@EnableConfigurationProperties(IpProperties.class)

注意:这三个不能一起用,否则@Component("ipProperties")起名字就不起作用,如果使用前面两个注解,那么第三个注解可以换成@Import(IpProperties.class)

(2.1.4)添加拦截器。 

(2.3)辅助功能开发(yml提示功能开发)。

自定义starter的spring-configuration-metadata.json文件展示

{"groups": [{"name": "tools.ip","type": "cn.itcast.properties.IpProperties","sourceType": "cn.itcast.properties.IpProperties"}],"properties": [{"name": "tools.ip.cycle","type": "java.lang.Long","description": "日志的显示周期","sourceType": "cn.itcast.properties.IpProperties","defaultValue": 5},{"name": "tools.ip.cycle-reset","type": "java.lang.Boolean","description": "是否周期内重置数据","sourceType": "cn.itcast.properties.IpProperties","defaultValue": false},{"name": "tools.ip.model","type": "java.lang.String","description": "日志输出模式 detail:详细模式  simple:极简模式","sourceType": "cn.itcast.properties.IpProperties"}],"hints": [{"name": "tools.ip.model","value": [{"value": "detail","description": "详细模式"},{"value": "simple","description": "极简模式"}]}]
}

导入这个坐标之后,执行maven的clean,然后compile编译,然后可以找到target/classer/META-INF/spring-configuration-metadata.json文件,将该文件复制到自定义starter中的resources/META-INF目录下。然后就可以将pom中刚加进入的坐标删掉(否则有重复的提示,因为有两个该json文件)。

 

为tools.ip.mode属性设置提示信息:

(3)核心原理。

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

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

相关文章

【3Ds Max】布料命令的简单使用

简介 在3ds Max中&#xff0c;"布料"&#xff08;Cloth&#xff09;是一种模拟技术&#xff0c;用于模拟物体的布料、织物或软体的行为&#xff0c;例如衣物、帆布等。通过应用布料模拟&#xff0c;您可以模拟出物体在重力、碰撞和其他外力作用下的变形和动态效果。…

C#系统锁屏事件例子 - 开源研究系列文章

今天有个网友问了个关于操作系统锁屏的问题。 我们知道&#xff0c;操作系统是基于消息和事件处理的&#xff0c;所以我们只要找到该操作系统锁屏和解屏的那个事件&#xff0c;然后在事件里进行处理即可。下面是例子介绍。 1、 项目目录&#xff1b; 下面是项目目录&#xff1a…

【BUG】docker安装nacos,浏览器却无法访问到页面

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

基于SSH框架实现的管理系统(包含java源码+数据库)

资料下载链接 介绍 基于SSH框架的管理系统 简洁版 &#xff1b; 实现 登录 、 注册 、 增 、 删 、 改 、 查 &#xff1b; 可继续完善增加前端、校验、其他功能等&#xff1b; 可作为 SSH&#xff08;Structs Spring Hibernate&#xff09;项目 开发练习基础模型&#xf…

前端打开后端返回的HTML格式的数据

前端打开后端返回的 HTML格式 的数据&#xff1a; 后端返回的数据格式如下示例&#xff1a; 前端通过 js 方式处理&#xff08;核心代码如下&#xff09; console.log(回调, path); // path 是后端返回的 HTML 格式数据// 必须要存进localstorage&#xff0c;否则会报错&am…

centos下使用jemalloc解决Mysql内存泄漏问题

参考&#xff1a; MySQL bug&#xff1a;https://bugs.mysql.com/bug.php?id83047&tdsourcetags_pcqq_aiomsg https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md &#xff08;1&#xff09;ptmalloc 是glibc的内存分配管理 &#xff08;2&#xff09;tcmalloc…

如何做好科技文献资料的翻译!

我们知道&#xff0c;科技文献是工程技术人员的重要参考文献&#xff0c;翻译科技文献资料有助于促进国内外科技知识和技术的传播。那么&#xff0c;如何做好科技文献资料的翻译&#xff0c;专业科技文献翻译哪家好&#xff1f; 据了解&#xff0c;科技文献翻译是一种以应用为主…

迈向通用听觉人工智能!清华电子系、火山语音携手推出认知导向的听觉大语言模型SALMONN

日前&#xff0c;清华大学电子工程系与火山语音团队携手合作&#xff0c;推出认知导向的开源听觉大语言模型SALMONN (Speech Audio Language Music Open Neural Network)。 大语言模型 SALMONN LOGO 相较于仅仅支持语音输入或非语音音频输入的其他大模型&#xff0c;SALMONN对…

insightface安装过程中提示 Microsoft Visual C++ 14.0 or greater is required.

pip install insightface安装过程中提示 Microsoft Visual C 14.0 or greater is required.Get it with "Microsoft C Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ 根据提示网站访问官网下载生成工具 打开软件后会自动更新环境&#…

AI搜索引擎助力科学家创新

开发者希望通过帮助科学家从大量文献中发现联系从而解放科学家&#xff0c;让他们专注于发现和创新。 图片来源&#xff1a;The Project Twins 对于专注于历史的研究者Mushtaq Bilal来说&#xff0c;他在未来科技中投入了大量时间。 Bilal在丹麦南部大学&#xff08; Universit…

「UG/NX」Block UI 曲线收集器CurveCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

机器人的运动范围

声明 该系列文章仅仅展示个人的解题思路和分析过程&#xff0c;并非一定是优质题解&#xff0c;重要的是通过分析和解决问题能让我们逐渐熟练和成长&#xff0c;从新手到大佬离不开一个磨练的过程&#xff0c;加油&#xff01; 原题链接 机器人的运动范围https://leetcode.c…

github以及上传代码处理

最近在github上传代码的时候出现了&#xff1a; /video_parser# git push -u origin main Username for https://github.com: gtnyxxx Password for https://gtny2010github.com: remote: Support for password authentication was removed on August 13, 2021. remote: Plea…

VB6编程IEEE浮点算法实践

纯代码实现浮点计算实际上对浮点算法的再实践。IEEE浮点表示法是Modbus RTU协议至今还在用的传送编码&#xff0c;更是WITS 1记录标准的基础。以往实现 MKI、CVI&#xff0c;MKL、CVL&#xff0c;MKS、CVS&#xff0c;MKD、CVD在高级语言里封装了现成的语句&#xff0c;现在Pow…

创建和运行 Ansible 临时命令

创建和运行 Ansible 临时命令 作为系统管理员&#xff0c;您需要在受管节点上安装软件。 请按照正文所述&#xff0c;创建一个名为 /home/curtis/ansible/adhoc.sh 的 shell 脚本&#xff0c;该脚本将使用 Ansible 临时命令在各个受管节点上安装 yum 存储库&#xff1a; 存储库…

【C++】函数指针

2023年8月18日&#xff0c;周五上午 今天在B站看Qt教学视频的时候遇到了 目录 语法和typedef或using结合我的总结 语法 返回类型 (*指针变量名)(参数列表)以下是一些示例来说明如何声明不同类型的函数指针&#xff1a; 声明一个不接受任何参数且返回void的函数指针&#xf…

OJ练习第151题——克隆图

克隆图 力扣链接&#xff1a;133. 克隆图 题目描述 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 示例 分析 对于一张图而言&#xff0c;它的深拷贝即构建一张与原图结构&#xff0c;值均一样的图&#xff0c;但是…

POSTGRESQL 关于安装中自动启动的问题 详解

开头还是介绍一下群&#xff0c;如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis &#xff0c;SQL SERVER ,ORACLE,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &…

Python “贪吃蛇”游戏,在不断改进中学习pygame编程

目录 前言 改进过程一 增加提示信息 原版帮助摘要 pygame.draw pygame.font class Rect class Surface 改进过程二 增加显示得分 改进过程三 增加背景景乐 增加提示音效 音乐切换 静音切换 mixer.music.play 注意事项 原版帮助摘要 pygame.mixer pygame.mix…

代码随想录算法训练营第三十八天 | 理论基础,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

代码随想录算法训练营第三十八天 | 理论基础&#xff0c;509. 斐波那契数&#xff0c;70. 爬楼梯&#xff0c;746. 使用最小花费爬楼梯 理论基础什么是动态规划动态规划的解题步骤动态规划应该如何debug 509. 斐波那契数递归解法 70. 爬楼梯746. 使用最小花费爬楼梯 理论基础 视…