【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)

	@Autowired
	private 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直接使用即可
步骤:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【IMU系列】什么是传感器的ODR和FSR实际如何配置传感器

使用更高的ODR信号有两个主要缺点&#xff1a;内存限制和功耗 以实际传感器为例

LeetCode题练习与总结:螺旋矩阵Ⅱ--59

一、题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1…

Redis: 配置文件详解(Redis.conf)

文章目录 一、Units二、INCLUDES三、NETWORK四、GENERAL五、SECURITY六、LIMITS 一、Units 单位&#xff0c;配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit&#xff0c;大小写不敏感 二、INCLUDES 包含&#xff0c;多…

Linux 学习之路 - 进程篇 - PCB介绍1-标识符

目录 一、基础的命令 <1> ps axj 命令 <2> top 命令 <3> proc 目录 二、进程的标识符 <1>范围 <2>如何获取标识符 <3>bash进程 三、创建进程 一、基础的命令 前面介绍了那么多&#xff0c;但是我们没有观察到进程相关状态&#x…

设计模式之责任链模式讲解

概念&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有对象处理它为止。最匹配的场景应该就是逐层审批的模式。 责任链模式只有两个角色&#xff…

JUC:ThreadPoolExecutor线程池的使用方法

文章目录 ThreadPoolExecutor线程池状态构造方法Executors 工厂方法newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutor 提交任务方法关闭任务方法 ThreadPoolExecutor 线程池状态 线程池用高三位表示状态&#xff0c;第一位为符号位。 TERMINATED > TIDYING …

若依ts版本(vue3+element plus+ts)

1、项目简介 本项目参考若依前后端分离版&#xff0c;前端由[若依vue3]改写为ts版本[ruoyi-web-vue3-ts]&#xff0c;后端对[若依V3.8.7]进行了修改[后端版本分支vue3.ts.3.8.7]&#xff0c;具体文档参见[若依官方文档]。本项目对部分代码做了优化&#xff0c;增加了activiti7…

【随笔】Git 高级篇 -- 提交的技巧(上) rebase commit --amend(十八)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

本地电脑渲染不行怎么解决?自助式渲染助你渲染无忧

有时候&#xff0c;即使购买了昂贵的新电脑&#xff0c;我们也可能会遇到渲染速度缓慢、画质不佳或渲染失败等问题。这些问题可能由多种因素引起。针对该问题&#xff0c;为大家推荐了自助式的渲染&#xff0c;解决你本地电脑渲染不佳问题。 电脑渲染不行原因 新电脑渲染效果不…

电影特效渲染为什么费时间?「瑞云渲染」

影视特效渲染过程通常耗时且资源密集&#xff0c;因为它涉及处理复杂的视觉元素和光影效果。瑞云渲染通过云技术提供解决方案&#xff0c;加快渲染速度并降低成本。简而言之&#xff0c;电影特效渲染之所以费时&#xff0c;是因为其对计算机资源的高需求。 电影特效渲染费时间原…

vs2017离线安装(配合QT5.9.2使用)

以vs2017_Professional版本为例&#xff1a; 一、下载安装包vs2017_Professional.exe&#xff08;在线安装包即可&#xff09; 二、创建在目录&#xff1a;C:\vs2017_Professional_Package&#xff0c;把vs2017_Professional.exe放在该目录下。 ID&#xff1a; Microsoft.Vis…

HCIP-Datacom(H12-821)题库补充(4月7日)

最新 HCIP-Datacom&#xff08;H12-821&#xff09;完整题库请扫描上方二维码访问&#xff0c;持续更新中。 在PIM-DM中&#xff0c;路由器会为被裁剪的下游接口启动一个剪枝定时器&#xff0c;定时器超时后接口就会恢复转发。默认情况下该定时器是多少秒&#xff1f; A&#x…

CASA模型教程

原文链接&#xff1a;CASA&#xff08;Carnegie-Ames-Stanford Approach&#xff09;模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600635&idx6&sna655a8de570edcaa435d6e917b66d9b3&chksmfa82081ccdf5810a33a778e8771bb116bde9e5a1f795da…

共生共舞的期货黄金和现货黄金

期货黄金&#xff0c;作为一种在金融市场上备受关注的投资工具&#xff0c;其价值与价格走势深受现货黄金市场的直接影响和联动。期货黄金交易&#xff0c;本质上是投资者对未来某一特定时间内黄金价格的预期进行押注&#xff0c;而这背后的逻辑支撑和价格基准正是现货黄金市场…

Mysql底层原理十一:Mvcc

为什么要mvcc&#xff1f; 提高并发度&#xff0c;如果读和写都是通过加锁的方式&#xff0c;并发肯定上不来&#xff0c;通过mvcc来实现写通过加锁&#xff0c;读通过mvcc readView机制 3.9.1 Undo版本链 再重复一遍&#xff0c;页面中的记录存放在用户表空间的数据页中&a…

OpenHarmony实战:物联网解决方案之芯海cst85芯片移植案例

本文介绍基于芯海cst85芯片的cst85_wblink开发板移植OpenHarmony LiteOS-M轻量系统的移植案例。 开发了Wi-Fi连接样例和XTS测试样例&#xff0c;同时实现了wifi_lite, lwip, startup, utils, xts, hdf等部件基于OpenHarmony LiteOS-M内核的适配。 移植架构上采用Board和Soc分…

【随笔】Git 高级篇 -- 相对引用2 HEAD~n(十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

原生小程序开发性能优化指南

性能优化指南 1.骨架屏 业务可以在数据加载完成之前用骨架屏幕来占位&#xff0c;提升体验。 2.包大小优化 减小包中静态资源&#xff0c;例如图片文件&#xff0c;可将图片进行压缩降低文件体积。无用文件、函数、样式剔除。除了部分用于容错的图片必须放在代码包&#xf…

烧坏两块单片机,不知道原因?

没有看你的原理图&#xff0c;以下是造成烧毁芯片的几个环节&#xff1a; 1. 最大的可能性是你的单片机电机控制输出与电机驱动电路没有隔离。 我的经验&#xff0c;使用STM32控制电机&#xff0c;无论是直流电机脉宽调制&#xff0c;还是步进电机控制&#xff0c;控制电路与…

耐压40V、输出电压1.23-37V可调,适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片&#xff0c;其输出电压有固定3.3V、5.0V和12.0V的版本&#xff0c;可以为客户省去…