【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.hqwc.cn/news/599886.html

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

相关文章

DLDP简介

定义 设备链路检测协议DLDP&#xff08;Device Link Detection Protocol&#xff09;用来监控光纤或铜质双绞线&#xff08;例如超五类双绞线&#xff09;的链路状态。如果发现单向链路存在&#xff0c;DLDP协议会根据用户配置&#xff0c;自动关闭或通知用户手工关闭相关接口…

pdf操作器(图片转文字、PDF转word、PDF拆分、图片jpg、png互转)

pdf操作器&#xff08;不用联网图片转文字、PDF转word、PDF拆分、图片jpg、png互转&#xff09;介绍目前该软件实现了以下功能 pdf转wordpdf拆分图片&#xff0c;图片导出在桌面的一个文件夹里图片合并为pdf压缩、转换图片格式&#xff08;jpg和png&#xff09;OCR图片转文字&…

【THM】Protocols and Servers 2(协议和服务器 2

介绍 协议和服务器房间涵盖了许多协议: 远程登录HTTP协议文件传输协议邮件传输协议POP3IMAP实现这些协议的服务器会受到不同类型的攻击。仅举几例,请考虑: 嗅探攻击(网络数据包捕获)中间人 ( MITM ) 攻击密码攻击(身份验证攻击)漏洞从安全的角度来看,我们始终需要思考…

儿童护眼台灯怎么选?台灯的十大品牌推荐

如果你家孩子看书开始眯眼了&#xff0c;或者斜着眼睛看&#xff0c;一定要留心是不是快要近视了。视力健康&#xff0c;尤其是儿童的视力健康&#xff0c;千万不可忽视&#xff01;很多家长以为主要孩子学习的时候光线足够亮&#xff0c;就不会伤眼&#xff0c;其实大多数孩子…

数字乡村创新实践:推动农村治理现代化

目录 一、数字乡村创新实践的内涵与意义 二、数字乡村创新实践的现状分析 三、推动农村治理现代化的数字乡村创新实践路径 &#xff08;一&#xff09;加强农村信息基础设施建设 &#xff08;二&#xff09;深化数字化应用推广 &#xff08;三&#xff09;加强数据资源整…

理解PostgreSQL中的postmaster.pid

在PG中&#xff0c;一个简要的体系结构图可以大致画成下边的样子&#xff1a; Server端基本上分成backend process和若干background process。这些process都是一个名为postmaster进程的子进程。而postmaster则是postgres进程的别名。 进程概况 [14:42:08-postgrescentos1:/pg…

Docker 引擎离线安装包采集脚本

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

【Linux】进程间通信——匿名管道|命名管道

目录 什么是进程间通信 管道 匿名管道 什么是进程间通信 进程间通信&#xff0c;顾名思义就是两个进程互相通信。 可是进程是独立的&#xff0c;该如何通信呢&#xff1f; 类比你和你的朋友在网上聊天&#xff0c;你们两个人也是独立的&#xff0c;是如何通信的呢&#xf…

openharmony launcher 调研笔记(01)数据初始化

最近在看launcher&#xff0c;把自己调研的点做个笔记&#xff0c;持续修改更新中&#xff0c;个人笔记酌情参考。 初始化MainAbility ● common 等 包以 三方库形式 被引入使用 在每个包中的oh-package.json5 文件有配置 { "devDependencies": {}, "n…

docker 部署 Epusdt - 独角数卡 dujiaoka 的 usdt 支付插件

部署 部署说明 部署之前必须注意的几点事项,该教程不一定适合所有用户: 本教程主要是使用 docker 部署,宝塔用户或宿主机直接安装的用户请直接参考官网教程.本教程是独立部署 epusdt,使用独立的mysql和redis,与dujiaoka项目分开. 在研究的过程中发现 epusdt 也需要用到 mys…

SpringCloud Alibaba Sentinel 规则持久化

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十七篇&#xff0c;即使用 Sentinel 实现规则持久化。 二、概述 从前面我们做的实验可知&#xff0c;…

SpringCloud Alibaba Sentinel 创建流控规则

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十四篇&#xff0c;即介绍 SpringCloud Alibaba Sentinel 创建流控规则。 二、基本介绍 我们在 senti…