springcloud实战:springboot的核心原理
wptr33 2024-12-07 17:45 22 浏览
Spring Boot核心原理
通过上篇的学习,读者应该对Spring Boot有了一个大致的认识,利用Spring Boot可以极大地简化应用程序的开发,这都归功于Spring Boot的四大核心原理:起步依赖、自动配置、Actuator和Spring Boot命令行。
本篇中,我们将深入探讨Spring Boot 的核心原理,以便读者能更好地学习和使用Spring Boot。
起步依赖机制
我们在使用Spring Boot搭建框架时,使用最频繁的特性就是起步依赖。所谓起步依赖,其本质是Maven项目的对象模型,通过传递依赖,我们很容易集成第三方框架。
起步依赖最明显的特征就是它的名称中包含starter,比如要集成Spring MVC 时,只需要添加spring-boot-starter-web 依赖即可。通过它的名称就可以看出,该依赖主要用于提供 Web支持。如果你曾使用过原生的Spring MVC框架,应该知道,我们需要添加很多依赖包才能正确集成SpringMVC。而在Spring Boot 中,我们无须添加这些依赖,因为Spring MVC的所有依赖包都包含在spring-boot-starter-web 中。
起步依赖还有一个好处,那就是版本管理。往常如果我们要集成一个第三方框架,需要知道它的版本号以及Maven如何依赖它,如果该第三方框架升级,还需要手动修改版本号并考虑是否存在版本冲突等问题。而通过添加 spring-boot-starter依赖,这一切都迎刃而解了。
Spring Boot的起步依赖的原则是,所有正式的启动程序都应遵循spring-boot-starter-*的命名格式。许多IDE中的 Maven集成允许按名称搜索依赖项。例如,安装了适当的Eclipse或STS插件后,你可以在POM Editor按下“Ctrl+空格”组合键,然后键入spring boot starter获得完整的框架列表。SpringBoot 官方集成了目前最流行的大多数应用程序框架,当我们希望集成某种功能时,只需要在官网( https://spring.io)或IDE中搜索对应依赖项并导入到应用即可。
图3-1列举了Spring Boot官方集成的一些第三方框架。
当然,如果我们在使用某种功能时,官方没有对应的starter依赖,也可以自定义starter满足需求。注意,我们在自定义时,命名通常以项目名开始,而不应该以spring-boot开始,因为它是为官方的SpringBoot构建而保留的。例如名为thirdpartyproject 的第三方启动程序项目通常命名为thirdpartyproject-spring-boot-starter。
Spring Boot起步依赖的核心思想其实就是依赖传递。如果我们需要自定义starter依赖,只需要按照官方对starter 的命名规则创建一个工程,然后将我们期望的依赖包添加进工程并发布到本地仓库或服务器上的 Maven私服即可。这样我们在应用中只需依赖自定义的starter 即可。
自动配置管理
Spring Boot 另一个非常强大的特性就是自动配置管理,通过该特性,我们可以在程序启动时向Spring容器中导入很多配置信息。在传统的Spring MVC架构中,我们一般通过烦琐的XML文件导入配置或注入 Bean;而在 Spring Boot中,这一切都将成为历史。
其实在第2章中,我们已经接触到了它。当创建一个Spring Boot应用时,都会提供一个启动类,该类添加了@SpringBootApplication注解,注解内部包含了@EnableAutoConfiguration注解,它便是Spring Boot的自动配置管理器。通过添加@EnableAutoConfiguration注解,可以自动加载配置信息。
以端口设置为例,我们在application.yml中通过server.port 定义好端口后,Spring Boot应用启动时就会设置为该端口号,那么它是如何实现的呢?其实,application.yml中的所有配置文件最终都会转化为实体类。Spring Boot 会将配置属性的实体类的名称以Properties结尾,放在org.springframework.boot.autoconfigure包下。server. port对应的实体类就是ServerProperties,其源码如下:
该类首先加入了@ConfigurationProperties注解,其作用就是定义配置属性,其中 prefix是属性前缀,这里为server。因此,server. port对应的就是ServerProperties类的 port字段,在程序启动时,Spring Boot配置管理器会自动将server. port装载到ServerProperties类的port字段中。
通过这种方式,我们完全可以“依葫芦画瓢”,在application.yml中定义自己的配置属性,并通过Spring Boot自动配置管理特性将其实例化到自定义类中。例如,我们在集成第三方平台时,一般都会要求传入appKey和 appSecret,这时就可以将它们定义到application.yml中,如:
然后创建Properties类以便提取配置信息,代码如下:
这里首先将前缀设置为third,注意字段名和 application.yml 中定义的属性名要一致(驼峰命名的允许转为用短横线隔开,如 appKey可以写成app-key )。此外,必须添加@Component注解,否则无法装载到Spring容器中,这样我们就可以通过@Autowired注解注入并使用它,如:
@Autowired
private ThirdProperties thirdProperties;
Actuator监控管理
Actuator是 Spring Boot的一个非常强大的功能,它可以实现应用程序的监控管理,比如帮助我们收集应用程序的运行情况、监测应用程序的健康状况以及显示HTTP跟踪请求信息等。它是我们搭建微服务架构必不可少的环节,是整个系统稳定运行的保障。
在Spring Boot中,集成Actuator也比较简单,只需要在pom.xml中添加以下依赖即可:
<dependency>
<groupid>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId></dependency>
Actuator 内置有很多端点( endpoint ),我们通过这些端点可以获得不同的监控信息。但Actuator默认只开启health和info两个端点。如果要开启更多的端点,可以通过以下配置实现:
management:
endpoints:
web:
exposure:
include: '*'
其中,'*'表示开启所有端点。当然,也可以指定开启的端点,如:
management:
endpoints:
web:
exposure:
include: health,info,httptrace
上述配置表示开启health、info和 httptrace端点。这时启动应用程序,访问地址 localhost:8081/demo/actuator/health,读者通常会在浏览器中看到如图3-2所示的界面。
上述界面提示为406,Not Acceptable,说明不能访问该地址。为了解决这个问题,在Spring Boot应用中,还需要在webConfig类中添加@EnablewebWvc注解,该注解表示启用WebMVC。之后重启应用并访问health端点,就可以看到如图3-3所示的界面,其中 status为UuP说明当前系统正常运行。
表3-1列举了Actuator内置的端点及其功能。
Spring Boot CLI命令行工具
Spring Boot CLI ( Command Line Interface)是一款用于快速搭建基于Spring原型的命令行工具。它支持运行Groovy脚本,这意味着你可以拥有一个与Java语言类似的没有太多样板代码的语法。通过CLI来使用Spring Boot 不是唯一方式,但它是让Spring应用程序“脱离地面”的最快速方法。
安装
要使用CLI,首先应从Spring官方仓库上下载CLI的 release版本,地址是 https:/repo.spring.iol/release/org/springframework/boot/spring-boot-cli/2.0.3.RELEASE/spring-boot-cli-2.0.3.RELEASE-bin.zip。
下载完成并解压后,打开spring-2.0.3.RELEASE文件夹,进入 bin目录,可以看到两个脚本文件,其中 spring用于Linux平台,spring.bat用于Windows平台。Spring Boot CLI依赖Groovy,但是我们不用单独安装它,因为它已经包含到Spring Boot CLI的依赖中了。
可以先将 spring.bat设置到环境变量中,如图3-4所示。
然后打开cmd命令行工具,输入spring --version,可以查看当前Spring Boot CLI的版本号,如:
C:AUsers\lynn>spring --version
Spring CLI v2.0.3.RELEASE
这样Spring Boot CLI就安装完成了。
用法
前面提到过,我们可以通过运行Groovy脚本来快速构建Spring Boot应用。因此,需要先创建一个Groovy脚本文件,并编写以下代码:
@RestController
class HelloController {
@RequestMapping("/")def home() {
"Hello World! "
}
}
上述代码和Java语法很像,它其实就是Groovy脚本代码。看这样一段代码,读者是否似曾相似呢?没错,它和我们编写的控制器类的代码是一样的,编写好这段代码并运行命令:
spring run app.groovy
其中,app.groovy就是你编写的Groovy脚本文件名。第一次启动时,Spring Boot CLI会下载很多依赖包,因此可能需要等待一段时间,启动完成后,访问localhost:8080,浏览器就会打印 Hello World!。
当然,如果读者对Groovy的语法不是很熟悉,我们还可以编写Java代码,如:
@RestController
public class Hellocontroller {
@RequestMapping("/")
public String home() {
return "Hello world ! "
}
}
需要注意的是,文件后缀需要改成.java,然后运行命令 spring run app.java即可。
小结
Spring Boot最核心的部分不外乎起步依赖机制、自动配置管理、Actuator监控管理和Spring BootCLI命令行工具,本章对它们分别进行了剖析。通过对四大核心的研究,读者应该对Spring Boot有了更深的了解,并为后面学习Spring Cloud打下坚实的基础。
本文给大家讲解的内容是springcloud实战:springboot核心原理
- 下篇文章给大家讲解的是springcloud实战:探索springcloud的秘密;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持
相关推荐
- MySQL进阶五之自动读写分离mysql-proxy
-
自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...
- 3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?
-
引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...
- 一文由浅入深带你完全掌握MySQL的锁机制原理与应用
-
本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...
- 验证Mysql中联合索引的最左匹配原则
-
后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...
- MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
-
目录1.索引基础...
- 你会看 MySQL 的执行计划(EXPLAIN)吗?
-
SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...
- MySQL 从入门到精通(四)之索引结构
-
索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...
- mysql总结——面试中最常问到的知识点
-
mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...
- mysql总结——面试中最常问到的知识点(2)
-
首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...
- MySQL基础全知全解!超详细无废话!轻松上手~
-
本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...
- 深入剖析 MySQL 中的锁机制原理_mysql 锁详解
-
在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...
- Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析
-
引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...
- MySQL基础篇:DQL数据查询操作_mysql 查
-
一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...
- MySql:索引的基本使用_mysql索引的使用和原理
-
一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
如何将AI助手接入微信(打开ai手机助手)
-
redission YYDS spring boot redission 使用
-
SparkSQL——DataFrame的创建与使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)