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

相关文章

Shiro

java项目Shiro、SpringSecurity、Sa-Token如何选择&#xff1f; - 知乎 (zhihu.com) Shiro、SpringSecurity、Sa-Token都是Java常用的安全框架 1&#xff09;Spring Security是基于Spring的身份认证(Authentication)和用户授权(Authorization) 框架&#xff0c;提供了一套Web应…

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

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

算法训练营第31天|LeetCode 455.分发饼干 376.摆动序列 53.最大子序列和

LeetCode 455.分发饼干 题目链接&#xff1a; LeetCode 455.分发饼干 解题思路&#xff1a; 从孩子小到大&#xff0c;找到最小能满足孩子的饼干&#xff0c;之后看最多能满足几个孩子。 代码&#xff1a; class Solution { public:int findContentChildren(vector<in…

蓝桥杯练习笔记(十八)

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

新增用户信息应该考虑什么?

前置数据校验 1. 用户的信息的合法性&#xff0c;如手机号&#xff0c;邮箱等jsr303检验 2. 用户数据脱敏处理&#xff0c;如密码 3. 短信验证码验证 &#xff08;随机数生成 redis 短信服务&#xff09; 4. 用户信息的账号唯一性校验 5. 给用户授权&#xff0c;如角色或其它…

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不能推导的场景 基于范围…

算法刷题记录 Day40

算法刷题记录 Day40 Date: 2024.04.06 kamma 56. 多重背包 #include<bits/stdc.h> using namespace std;int main(){int n, c;while(cin>>c>>n){vector<int> weights(n, 0);vector<int> values(n, 0);vector<int> knums(n, 0);for(int …

一文掌握python面向对象

面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它将现实世界的问题抽象成类和对象,通过封装、继承和多态等特性实现程序设计的模块化与灵活性。Python作为一门支持OOP的高级语言,其面向对象的特性使得代码更加简洁、易读且易于维护。本文旨在全…

RTThread studio 驱动开发

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

Python - 基础知识

变量 语法&#xff1a; a 10 #意思是创建一个a变量&#xff0c;把10存放到a变量中。 #这里说明一下&#xff0c;#在Python中是是注释符 print(a) #print是打印函数 变量是一个可以发生改变的量&#xff0c;变量是用来区分不同数据的&#xff0c;可以指向一个内存空间&…

如何定位和优化程序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;你可以来这里 下载体验 它&…

记录一次云主机云监控客户端故障

场景&#xff1a;客户弹性云主机的云监控客户端本来正常。 但是昨天下午突然不行了&#xff0c;提示故障。 仔细排查发先&#xff0c;ps -ef|grep telescop 进程是在的 于是查看正常的/etc/resolv.conf里面的dns信息&#xff0c;发现故障的少了一天dns信息&#xff0c; 100.…