从Spring进化为SpringBoot

目录

零.@SpringBootApplication

一.起步依赖

二.自动配置

三.自动配置的原理

1.装配常见方案

【1】方案1:@ComponentScan 组件扫描

【2】方案2:@Import 导入

【3】使用第三方依赖提供的 @EnableXxxxx注解

2.自动装配原理

3.实现starter

四.内置Tomcat


SpringBoot相比于Spring简化了开发,得益于它两个非常重要的功能:一个是起步依赖,一个是自动配置。

通过SpringBoot所提供的起步依赖,就可以大大的简化pom文件当中依赖的配置。

通过自动配置的功能就可以大大的简化在使用时Bean的配置类书写。
这样我们只需要引入程序开发时所需要的起步依赖,我们就可以直接使用其中的Bean了。

零.@SpringBootApplication

这个注解是Spring Boot项目的基石,创建SpringBoot项目之后会默认在主类加上。

@SpringBootApplication
public class SpringSecurityJwtGuideApplication {public static void main(java.lang.String[] args) {SpringApplication.run(SpringSecurityJwtGuideApplication.class, args);}
}

我们可以把 @SpringBootApplication看作是 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。

package org.springframework.boot.autoconfigure;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {......
}package org.springframework.boot;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}

根据 SpringBoot 官网,这三个注解的作用分别是:
(1)@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
(2)@ComponentScan:扫描被@Component (@Repository,@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。
(3)@Configuration:声明这个类是配置类。
并允许在 Spring 上下文中注册额外的 bean 或导入其他配置类。

这个注解是自动装配的核心,后面会讲到。

一.起步依赖

简单说就是我们只要引入一个starter依赖,与之相关的依赖jar包都会被引入。

注:starter是SpringBoot中常见项目名称,定义了很多该依赖所使用的其他依赖坐标,以达到简化配置的目的。

原理就是Maven的依赖传递。

例:

比如springboot-starter-web,这是web开发的起步依赖,在web开发的起步依赖当 中,就集成了web开发中常见的依赖:json、web、webmvc、tomcat等。我们只需要引入 这一个起步依赖,其他的依赖都会自动的通过Maven的依赖传递进来。

二.自动配置

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

解释:先回顾一下之前的spring注解开发的步骤

具体流程:定义Bean【第三方或自定义】->扫描进容器管理【扫描包或配置类】->依赖自动注入或按名称注入【普通类型可以通过配置文件注入】

简单说自动配置就是省略中间那一步。也就是我们自己扫描包(也就是配置)的过程,而采用自动配置。
 

之前要用@Component注册Bean,并且使用@ComponentScan之类的注解在配置类上对Bean进行扫描。
现在使用SpringBoot的@SpringBootApplication就实现了在启动时通过自动配置。将自定义Bean和第三方starter中的Bean自动装配到容器。

现在自定义的Bean的话只需要@Component和@Configuration注册Bean就可以了,后续不用管它。第三方starter的话只需要引入就可以通过@Autowired或@Resource注入Bean直接用。

附:在SpringBoot中@Configuration作用和@Component一样。

@Configuration一般用来声明配置类,可以使用@Component注解替代,不过使用注解@Configuration声明配置类更加语义化。

@Configuration
public class AppConfig {@Beanpublic TransferService transferService() {return new TransferServiceImpl();}
}

一般@Configuration用来配置第三方Bean,而@Component用来自定义Bean。

三.自动配置的原理

1.装配常见方案

我们可以试试自定义第三方Bean并引入依赖,会发现引入进来的第三方依赖当中的bean以及配置类为什么没有生效。

原因在我们之前讲解IOC的时候有提到过,在类上添加@Component注解来声明bean对象时,还需 要保证@ComponentScan注解能被Spring的组件扫描到。

SpringBoot项目中的@SpringBootApplication注解,具有包扫描的作用,但是它只会扫描启动类所在的当前包以及子包。
当前包:com.flyingpig, 第三方依赖中提供的包扫描不到。

那么如何解决以上问题的呢,那就是扫描我们第三方依赖的包。那怎么扫描呢,主要有三种方法。

【1】方案1:@ComponentScan 组件扫描

@SpringBootApplication
@ComponentScan({"com.flyingpig","com.example"}) //指定要扫描的包
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class,args);}
}

缺点: 1. 使用繁琐 2. 性能低

【2】方案2:@Import 导入

使用@Import导入的类会被Spring加载到IOC容器中

(1)引入类

@Import(TokenParser.class) //导入的类会被Spring加载到IOC容器中
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class,args);}
}

(2)导入配置类

@Configuration
public class HeaderConfig {@Beanpublic HeaderParser headerParser(){return new HeaderParser();}@Beanpublic HeaderGenerator headerGenerator(){return new HeaderGenerator();}
}
@Import(HeaderConfig.class) //导入配置类
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class,args);}
}

(3)导入ImportSelector接口实现类

public class MyImportSelector implements ImportSelector {public String[] selectImports(AnnotationMetadata importingClassMetadata) {//返回值字符串数组(数组中封装了全限定名称的类)return new String[]{"com.example.HeaderConfig"};}
}
@Import(MyImportSelector.class) //导入ImportSelector接口实现类
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class,args);}
}

上面两种方法对程序员比较很繁琐,不友好。

那我们如何我们不用自己指定要导入哪些bean对象和配置类了,让第三方依赖它自己来指定。

【3】使用第三方依赖提供的 @EnableXxxxx注解

在使用时只需在启动类上加上@EnableXxxxx注解即可

@EnableHeaderConfig //使用第三方依赖提供的Enable开头的注解
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class,args);}
}

2.自动装配原理

在前面讲到的@SpringBootApplication注解中包含了:
【1】元注解(不再解释)
【2】@SpringBootConfiguration--底层是@Configuration注解,表明SpringBoot启动类就是一个配置类。
【3】@ComponentScan--用来进行组件扫描的,这里扫描启动类所在的包及其子包下所有Bean。
也就是说这个注解实现了自定义Bean的自动装配。

【4】@EnableAutoConfiguration--核心注解,实现第三方Bean自动装配。

底层封装了@Import注解(Import注解中指定了一个ImportSelector接口的实现类)
在实现类重写的selectImports()方法,读取当前项目下所有依赖jar包中META-INF/spring.factories、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfigurat ion.imports两个文件里面定义的配置类(配置类中定义了@Bean注解标识的方法)。

当SpringBoot程序启动时,就会加载配置文件当中所定义的配置类,并将这些配置类信息(类的全限定名)封装到String类型的数组中,最终通过@Import注解将这些配置类全部加载到Spring的IOC容器 中,交给IOC容器管理。

简单说就是第三方依赖定义配置类,然后通过底层的@Import注解调用接口实现类读取配置文件中的配置类,再读取其中的Bean进行配置。
而不用在代码中自己定义扫描了。

这些所有的自动配置类当中,所有的 bean都会加载到 spring 的 IOC 容器当中吗?

并不会。在声明 bean 的时候,通常会加上这么一类@Conditional 开头的注解。这个注解就是进行条件装配。所以SpringBoot非常的智能,它会根据 @Conditional 注解来进行条件装配。只有条件成立,它才会声明这 个bean,才会将这个 bean 交给 IOC 容器管理。

3.实现starter

在自定义一个起步依赖starter的时候,按照规范需要定义两个模块,一个用来实现起步依赖,一个用来实现自动配置
1. starter模块(进行依赖管理[把程序开发所需要的依赖都定义在starter起步依赖中])
2. autoconfigure模块(自动配置) 将来在项目当中进行相关功能开发时,只需要引入一个起步依赖就可以了,因为它会将 autoconfigure自动配置的依赖给传递下来。

注:

SpringBoot官方starter命名: spring-boot-starter-xxxx
第三组织提供的starter命名: xxxx-spring-boot-starter

需求明确了,接下来我们再来分析一下具体的实现步骤:
第1步:创建自定义starter模块(进行依赖管理)
第2步:创建autoconfigure模块 在starter中引入autoconfigure (我们使用时只需要引入starter起步依赖即可)
第3步:在autoconfigure中完成自动配置
1. 定义一个自动配置类,在自动配置类中将所要配置的bean都提前配置好
2. 定义配置文件,把自动配置类的全类名定义在配置文件中

四.内置Tomcat

为什么我们之前书写的SpringBoot入门程序中,并没有把程序部署到Tomcat的webapps目录 下,也可以运行呢?

原因呢,是因为在我们的SpringBoot中,引入了web运行环境(也就是引入spring-boot-starter-web起步依赖),其内部已经集成了内置的Tomcat服务器。

我们可以通过IDEA开发工具右侧的maven面板中,就可以看到当前工程引入的依赖。其中已经将 Tomcat的相关依赖传递下来了,也就是说在SpringBoot中可以直接使用Tomcat服务器。

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

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

相关文章

虚拟直播赋能文旅,蓝海创意云亮相文旅虚拟现实应用推广交流活动

3月21日,由文化和旅游部产业发展司主办,中国信息通信研究院、北京市石景山区文化和旅游局、中国动漫集团有限公司承办的文化和旅游虚拟现实应用推广交流活动在首钢一高炉SoReal科幻乐园33 Meta Club举办。蓝海创意云应邀参与此次活动,携vLive…

MySQL索引的创建与基本用法

文章目录 MySQL索引MySQL索引的类型与创建方法基础索引 唯一索引**唯一索引的创建** ******注意唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。*** ***主键索引组合索引**…

Java毕业设计 基于springboot医院挂号系统 医院管理系统

Java毕业设计 基于springboot医院挂号系统 医院管理系统 springboot医院挂号系统 医院管理系统 功能介绍 用户:登录 首页 个人资料 修改密码 门诊管理 用户挂号 医生:登录 首页 个人资料 修改密码 门诊管理: 用户挂号 处方划价 项目划价 项目缴费 项目…

C++多线程并发学完后,该学什么呢?

概述 如何安排知识点的学习次序,有很多做法,下面提供一种思路。 答:C在多线程学完后,可以学网络。 相当于这么一个学习及实际开发中常见演进过程: 单线程、无网络的程序: 一家公司,一个员工…

多级页表查询

说明一下这个三级页表的查询,会需要上面的L2,L1,L0 如果在二级页表level就是2,PGSHIFT是12,那么就是往左移129*2位置,在&9bit就得到L2,其他以此类推 也表查询,首先有跟页表的地址pagetable,…

测径仪:大小通吃的“直径判官”

嗨,大家好!今天我要给你们介绍一个超级厉害的玩意儿——在线测径仪!它可不是一般的测量工具,它是那个能让直径无处遁形的“直径判官”! 想象一下,有了在线测径仪,你就像是拥有了一双超级敏锐的“…

elasticsearch的数据搜索

DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查询:利用分词器对用户…

docker容器下部署hbase并在springboot中通过jdbc连接

我在windows的docker中部署了一个hbase服务,然后用springboot连接到此服务并访问数据。 详情可参考项目中的README.md。项目中提供了用于构建镜像的dockerfile,以及测试代码。 项目连接:https://gitee.com/forgot940629/hbase_phoenix_spring…

【Windows 常用工具系列 15 -- VMWARE ubuntu 安装教程】

文章目录 安装教程镜像下载 工具安装 安装教程 安装教程参考链接:https://blog.csdn.net/Python_0011/article/details/131619864 https://linux.cn/article-15472-1.html 激活码 VMware 激活码连接:https://www.haozhuangji.com/xtjc/180037874.html…

一下想要邮寄很多快递,该怎么邮寄呢?

我们都知道淘宝网上开店的经常会邮寄很多快递,但是这么多快递不可能一下子拿到快递驿站去邮寄吧,但是快递员又不上门取件可怎么办呀,这可真是让人伤透了脑筋了, 我们都知道我们所在的区域一般都会有快递员来承揽我们所在区域的快递…

Jenkins安装 Linux 更换镜像 安装插件

Jenkins安装 Linux 更换镜像 安装插件 前言 下面叙述了三种jenkins安装的方式,jenkins安装之前必须有java环境因为他是java写的… yum安装只能安装最新版本的jenkins,但是jenkins是java写的所以他强依赖java版本,当你的服务器的java版本与jenkins版本冲突时还需要给jenkins重…

烟火AI识别检测算法在新能源汽车充电桩站点的应用方案

新能源汽车作为现代科技与环保理念的完美结合,其普及和应用本应带给人们更加便捷和绿色的出行体验。然而,近年来新能源汽车充电火灾事故的频发,无疑给这一领域投下了巨大的阴影。这不禁让人深思,为何这一先进的交通工具在充电过程…

C语言复杂度(个人笔记)

时间复杂度主要衡量一个算法的运行快慢. 空间复杂度主要衡量一个算法运行所需要的额外空间. 时间复杂度 算法中的基本操作的执行次数,为算法的时间复杂度. 只需要大概执行次数,我们使用大O的渐进表示法。(看谁对数学表达式的影响最大) 空间复杂度 是…

python 教你如何创建一个自定义库 colorlib.py

目录 Colorlib 生成代码 模块代码 导入测试 测试一 测试二 应用测试 颜色列表 colorList 随机颜色元组 randcolorTuples 随机颜色字串 randcolorStrings Color类测试 测试一 测试二 题外话 Colorlib 有没有碰到过这样的场景:写代码时想要用上丰富的色…

图像几何变换(仿射变换和透视变换...)及python-opencv实现

文章目录 图像变换类型仿射变换透视变换python-opencv实现参考文献 图像变换类型 图像几何变换主要包括以下几种类型: 平移(Translation):将图像在水平或垂直方向上移动,不改变图像的尺寸和形状。缩放(Sca…

Java并发

目录 线程 什么是线程 进程和线程的区别 线程的生命周期 什么是多线程 并发与并行 多线程的三种实现方式 继承Thread类 1.创建类继承Thread类 2.重写run()方法 3.创建对象启动线程 实现Runnable接口 1.自己定义一个类实现Runnable接口 2.重…

程序猿成长之路之番外篇——矩阵算法

今天在复习线性代数知识的过程中,用java语言简单实现了一下矩阵算法。 数学知识回顾 1.什么是矩阵 在数学领域,矩阵就像一个表格,将数据排放进去,形成一个矩形。我们习惯用一个大括号把矩阵内的数据包括进来。 1.矩阵 在数学领域…

JavaScript parseInt() 函数

JavaScript parseInt() 函数 从官方理解: parseInt() 函数解析字符串并返回整数。 radix 参数用于指定使用哪种数字系统,例如基数为 16(十六进制)表示字符串中的数字应从十六进制数解析为十进制数。 如果 radix 参数被省略&…

Java SE

java概述 1.什么是java java是一门面向对象的编程语言,作为静态面向对象编程语言,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。 2.java语言有哪些特点? 2.1面向对象(继承封装多多态&…

Uscrapper:一款功能强大的网络资源爬取工具

关于Uscrapper Uscrapper是一款功能强大的网络资源爬取工具,该工具可以帮助广大研究人员从各种网络资源中轻松高效地提取出有价值的数据,并且提供了稳定、友好且易于使用的UI界面,是安全研究人员和网络分析人员的强有力工具。 Uscrapper最大…