【javaWeb 原理篇】底层实现原理(快速学习配置原理,Bean管理)

Spring底层

  • 配置优先级
  • Bean管理
    • 获取bean
    • Bean的作用域
      • 第三方Bean
  • SpringBoot原理
    • 起步依赖
    • 自动配置
      • 自动配置的原理
      • 自定义starter

配置优先级

Spring中的配置文件如果配置了相同的内容则根据配置优先级进行配置:
application.properties>application.yml>application.yaml
注意:虽然SpringBoot支持多种配置文件,但在项目开发时,统一使用一种格式的配置文件yml

SpringBoot 除了支持配置文件属性配置,还支持java属性配置和命令行参数的方式进行属性配置

java属性配置:-Dserver.port=9000
命令行参数:–server.port=10010

在这里插入图片描述
在项目打包之后如何配置命令行参数:
在这里插入图片描述
注意:SpringBoot项目打包时,需要引入插件,spring-boot-maven-plugin(基于官网骨架创建项目,会自动添加该插件)
java属性配置的优先级高于命令行高于三种配置文件


Bean管理

获取bean

默认情况下,spring项目启动时,会把bean都创建好存放在IOC容器中,主动获取bean对象:

根据name获取bean:
Object getBean(String name)
根据类型获取Bean
<T> T getBean(Class<T> requiredType)
根据name获取Bean(带类型转化):
<T> T getBean(String name,Class<T> requiredType)
@Autowiredprivate ApplicationContext applicationContext;  //这是一个IOC容器对象public void caozuoBean(){// 根据名称得到bean对象DeptController bean1 = (DeptController) applicationContext.getBean("deptcontroller");//根据bean类型获取DeptController bean = applicationContext.getBean(DeptController.class);//根据bean的名称及类型获取DeptController bean2 = applicationContext.getBean("deptcontroller", DeptController.class);

输出这三个对象你会发现,输出的对象都是相同的对象,说明IOC容器中的Bean是单例的

Bean的作用域

Bean的作用域
可以通过 @Scope 注解来进行配置作用域:

@Scope"prototype"@Restcontroller
@RequestMapping("/depts/")
public class Deptcontroller(){
}

注意:默认singleton的bean,在容器启动的时候被创建,可以使用 @Lazy注解来延迟初始化(延迟到第一次使用时)。
prototype的bean,每一次使用该bean的时候都会创建一个实例
实际开发过程中,绝大部分的Bean都是单例的,也就是说绝大部分Bean不需要配配置scope属性

第三方Bean

如果要管理的bean对象来自于第三方(不是自定义的),是无法用 @Component 及衍生注解声明的bean的,就需要用到 @Bean注解

若要管理的第三方bean对象,建议对这些类进行集中配置,可以通过 @Configuration注解声明一个配置类,这个注解的底层也是 @Component

通过 @Bean注解的name/value的属性指定bean名称,如果未指定,则默认为方法名

如果第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配
在类中:

@Bean //将方法的返回值交给IOC容器来管理,成为IOC容器的bean对象
public SAXReader saxreader(){
return new SAXReader();
}

这种方法一般不建议,建议在配置类中进行声明:

@Configuration
public class CommonConfig{
@Bean
public SAXReader saxreader(){
return new SAXReader();
}
}

但是在Spirng导入类中未必会将所有的Bean都加载到IOC容器中,可能会出现扫描不到的问题


SpringBoot原理

起步依赖

Spring中的最基础框架,Spring FrameWork框架,但是使用它直接进行项目的开发会十分的繁琐,项目的依赖配置等都必须手动亲自完成,包括依赖的版本都必须亲自进行匹配(不然会出现版本冲突问题) ,SpringBoot框架可以简化Spring FrameWork的开发(通过起步依赖,自动配置两大功能来简化Spirng的配置好问题)

  • 起步依赖

起步依赖也是通过maven的依赖传递进行相关依赖的配置

自动配置

SpringBoot的自动配置就是当Spring容器自动启动后,一些配置类,Bean对象就自动的存入到IOC容器当中,不需要我们去手动声明,从而简化了开发,省去了繁琐的步骤

Gson 的gson对象,是处理json数据的工具对象,他可以生成json的字符串,我们在类中可以直接调用该类,是因为在创建初期Spring就已经将这个类配置好了

@Autowired
private Gson gson;
public void TestJson(){
String json=gson.tojson(Result.success());
System.out.println(json);
}

自动配置的原理

就是如何解释,项目中引入依赖之后,如何将依赖直接加载到项目的Spring IOC容器之中的

这个时候我们就要引进一个问题:
如果这个时候我们引进了一个自定义的第三方依赖包,在项目中引进这个第三方依赖包,但是当我们注解注入后运行时发现找不到这个第三方依赖包为什么?

因为当我们引进第三方依赖包的时候,在主方法类中的注解 @SpringBootApplication 对bean进行扫描,但是范围仅限于其所在包及其子包,第三方依赖不在其范围不能被他扫描到

针对这个问题:
方案一:我们可以通过 @ComponentScan注解组件扫描
同时也可以将项目中扫描不到的Bean重新进行扫描

@CompomentScan({包名})
@springBootApplication
public class SpringbootWebConfig2Application{
}

由于方案一非常繁琐(没要导入新的包,都需添加新的扫描)
方案二:通过 @import导入,使用注解导入类会被Spring加载到IOC容器当中去,导入的注解主要有:普通类,配置类,ImportSelector接口实现类

通过 @import注解进行导入 (普通类以及配置类):

@import({TokenParser.calss,HeaderConfig.class})
@SpringBootApplication
public class SpringBootWebConfigApplication{
}

导入ImportSelector接口实现类:
当进行接口实现类时:
在这里插入图片描述

@Import{MyImportSelector.class}@springBootApplication
public class SpringBootWebConfigApplication{
}

在接口实现类中重写方法,返回字符串类型数组,这里将我们要加载到bean对象的全类名放到数组中,在通过 @import注解将数组中的类都加载到IOC容器之中

除此之外,第三方也可以自己给出自定义的第三方注解 @EnableXxx自定义注解中就实现了 @import

同时也可以通过自定义注解@Import注解放在其中,之后直接通过自定义注解完成该功能,@EnableXxx

@EnableHeaderConfig
@springBootApplication
public class SpringBootWebConfigApplication{
}
  • 剖析SpringBoot自动配置的原理

我们从SpringBoot的引导类的注解 @SpringBootApplication开始进行剖析
在这里插入图片描述
其中 @EnableAutoConfiguration注解中, @Import注解中将配置类文件中所有的配置类返回到数组中将他们都注入到IOC容器之中

  • @Conditional

作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中
位置:方法,类
Conditional 本身是一个父注解,派生出大量的子注解:
@ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器
@ConditionalOnMissingBean:判断环境中没有对应的Bean(类型或名称),才注册bean到IOC容器当中
@ConditionalOnproperty :判断配置文件中对应属性和值,才注册bean到IOC容器

@ConditionalOnClass(name="io.jsonwebtoken.Jwts")
@ConditionalOnMissingBean
@ConditionalOnproperty(name="name",havingValue="")

例如:

@Bean
@ConditionalOnMissingBean
public Gson gson(...){
}

自定义starter

在实际开发中,经常会定义一些公共组件,提供各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的starter
如何区分官方的组件和其他的组件:
官方的组件命名时 spring-boot-starter-web 这样的,而其它的项目组件的功能名称在前,例如:mybatis-spring-boot-starter

需求:自定义aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具类AliyunOSSUtils的自动配置
目标:引入起步依赖之后,要想使用阿里云OSS,注入AliyunOSSUtils直接使用即可
步骤:
在这里插入图片描述

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

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

相关文章

用Python+OpenCV截取视频中所有含有字幕的画面

1、需求背景 有的视频文件的字幕已经压制到了视频的图像中&#xff0c;不能单独提取出字幕文件。网上的 “提取视频字幕” 网站多为提取视频中的字幕文件&#xff0c;而非识别视频图像中的字幕。少数通过OCR技术识别画面中字幕的工具需要在线运行、运行速度较慢&#xff0c;或…

蓝桥杯练习笔记(十八)

蓝桥杯练习笔记&#xff08;十八&#xff09; 一、用辅助栈来优化递归深度过大的问题 输入示例 0000100010000001101010101001001100000011 0101111001111101110111100000101010011111 1000010000011101010110000000001011010100 0110101010110000000101100100000101001001 0…

QT打包生成.exe可执行文件

QT打包生成.exe可执行文件 程序运行图标如何设置快捷方式显示图标QT打包成可执行文件将可执行文件打包成安装包程序运行图标 如何生成如下图标? 首先将你的图标(ico文件)放入当前工程目录,即含有.pro文件的同级目录 右击项目,选择ADD New,选择Qt Resource File, 这是一个…

吴恩达2022机器学习专项课程(一) 5.7 检测梯度下降是否收敛

问题预览/关键词 什么是梯度下降收敛&#xff1f;哪些方法可以检测梯度下降是否收敛&#xff1f;什么是学习曲线&#xff1f;曲线上升代表什么&#xff1f;什么原因造成的&#xff1f;如何检测梯度下降是否收敛&#xff1f;多少次迭代&#xff0c;梯度下降会收敛&#xff1f;什…

C++:初步接触C++(2)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习C&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 内联函数1.概念2.特性 auto关键字1.auto简介2.auto的使用细则3.auto不能推导的场景 基于范围…

RTThread studio 驱动开发

rtthread 驱动使用的两种情况 rtthread studio 自动生成 由 RT Thread Studio 自动生成&#xff0c;无需修改任何文件或者简单定义几个宏即可直接使用的驱动&#xff0c;如 GPIO&#xff0c;UART&#xff0c;I2C&#xff0c;SPI&#xff0c;SDIO 和 ETH 等。 使用 RT-Thread S…

如何定位和优化程序CPU、内存等性能之巅

如何定位和优化程序CPU、内存等性能之巅 摘要 性能优化指在不影响系统运行正确性的前提下&#xff0c;使之运行得更快&#xff0c;完成特定功能所需的时间更短&#xff0c;或拥有更强大的服务能力。本文将介绍性能优化的基本概念以及如何定位和优化程序中的CPU、内存和IO瓶颈…

信息泄露漏洞的JS整改方案

引言 &#x1f6e1;️ 日常工作中&#xff0c;我们经常会面临线上环境被第三方安全厂商扫描出JS信息泄露漏洞的情况&#xff0c;这给我们的系统安全带来了潜在威胁。但幸运的是&#xff0c;对于这类漏洞的整改并不复杂。本文将介绍几种可行的整改方法&#xff0c;以及其中一种…

指挥中心控制台厂家定制控制台技术规范全方位指南

指挥中心控制台作为现代化管理的重要组成部分&#xff0c;在整个企业的运行中起着重要作用&#xff0c;为了保证指挥中心的正常运行&#xff0c;控制台的定制不可缺少&#xff0c;那么指挥中心控制台厂家定制控制台技术规范是什么? 1. 结构性能规范&#xff1a;控制台需采用优…

kmeans聚类sklearn实现(Python实验)

Kmeans毫无疑问&#xff0c;好用又“便宜”的算法&#xff0c;经常在很多轻量化场景中实现。所谓的“聚类”&#xff08;Clustering&#xff09;&#xff0c;就是通过欧氏距离找哪些点构成一个簇。假设我们空间中有一堆点&#xff0c;通过肉眼大概可以看出有两簇&#xff0c;思…

jmeter压测websocket协议

一、jmeter 安装websocket插件 1、选项--插件管理 2、搜索WebSocket Samplers by Peter Doornbosch插件 进行安装 3、 重启 jmeter 二、jmeter压测websocket协议实战 2.1、以网站为例&#xff1a; websocket在线测试 1、断开连接 2、打开F12&#xff0c;查看WS数据 3、…

DragonIM龙通讯

前言 龙通讯是一款C/S架构的即时通讯软件&#xff0c;实现了用户注册、登录、好友私聊、群聊&#xff08;文字、表情、文件&#xff09;&#xff0c;群文件上传/下载&#xff0c;群公告&#xff0c;朋友圈&#xff08;可点赞和评论&#xff09;&#xff0c;AI聊天&#xff0c;…

剪切助手-高颜值的跨平台剪切板工具

高颜值的跨平台剪切板工具来了&#xff01;&#xff01; http://t.csdnimg.cn/xKB3B 出于我的一些日常使用需求以及在对比了其他剪切板软件后&#xff0c;我决定做一个跨平台的高颜值剪切板工具《剪切助手》&#xff01; 废话不多说&#xff0c;你可以来这里 下载体验 它&…

day76 jquery

知识点: 1 在HTML中引入jQuery 2 jQuery中就绪函数 3 jQuery中选择器 4 使用jQuery获取表单元素的值 及标签中间的内容 5 jQuery中获取标签属性 6 jQuery设置和获取标签样式 ----------------------------------- 一 在HTML中引入jQuery 1/*! jQuery…

RFID涉密载体柜 RFID智能文件柜系统

涉密载体管控RFID智能柜&#xff08;载体柜DW-G101R&#xff09;通过对涉密物资、设备进行RFID唯一标识并放置于RFID设备涉密物资柜柜体&#xff0c;通过定位每台设备每件涉密物资的位置&#xff0c;实现涉密物资审批、自助借还、防盗等出入库全流程自动化管理。主要管理对象移…

redis 集群模式(redis cluster)介绍

目录 一 redis cluster 相关定义 1&#xff0c; redis cluster 是什么 2&#xff0c;redis 集群的组成 3&#xff0c;集群的作用 4&#xff0c;集群架构图 二 Redis集群的数据分片 1&#xff0c;哈希槽是什么 2&#xff0c;哈希槽如何排布 3&#xff0c;Redis集…

五边形信息图表绘制方法

五边形信息图表绘制方法 在网络科技发展进步的当下&#xff0c;原来一些传统的统计图表都有了进一步的创新。以前企业的PPT都依赖微软的各应用软件来制作图表&#xff0c;现时企业的PPT展示的图表应用不再满足于原来的图表绘制方法&#xff0c;进而使用一些第三方应用软件来制作…

Linux_进程的优先级环境变量上下文切换优先级队列

文章目录 一、进程的优先级二、进程的四个重要概念三、上下文切换四、环境变量查看当前shell环境下的环境变量与内容 五、Linux2.6内核进程调度队列一个CPU拥有一个runqueue优先级活动队列过期队列active指针和expired指针 一、进程的优先级 什么是优先级&#xff1f; 指定一个…

如何使用宝塔面板搭建MySQL数据库并实现无公网IP远程访问

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cp…

rhce复习3

DNS DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。 DNS系统使用的是网络的查询&#xff0c;那么自然需要有监听的port。DNS使用的是53端口&#x…