SpringBoot - Syntax
1. 环境搭建
完整配置项清单,详见: Common Application Properties (spring.io)
SpringBoot Starter,详见: Developing with Spring Boot
1.1 Spring.io 建立项目
通过Spring.io 网站,自动建立一个springboot项目,失败的常见问题列表:
- Spring Initailizer 在创建的过程中,如果出现“java: 警告: 源发行版 17 需要目标发行版 17” 的错误,是JDK配置不对导致,解决方法参见:IDEA运行Spring工程报错:java: 警告: 源发行版 17 需要目标发行版 17
- Spring Boot 2.7.x 支持JDK8, Spring Boot 3.x.x 需要JDK17, 详细对应关系见: SpringBoot版本与JDK版本的对应关系_springboot和jdk版本对应
- Intellij Idea中出现 错误 “spring boot Cannot resolve method 'run(Class, String[])'”,请用该方法解决:解决idea中springboot出现Cannot resolve method 'run(java.lang.Class, String[])
- Intellij Idea中的 Run的绿色按钮是灰色的,那么则需要等待上述问题解决之后,再等待一下,Idea自动变绿。
1.2 Spring Initializer建立项目
通过IntelliJ Idea 当中的Spring initializer,自动建立一个springboot项目,失败的常见原因列表:
- 在POM文件当中加入 "spring-boot-stareter-web" 的artifactId,仍然无法启动tomcat,原因是包没有被导入,刷新 Intellij Idea中Maven的Dependencies即可。
Note备注:
- Spring Boot banner在线生成网站为: https://www.bootschool.net/ascii
- @Controller, @RestController 以及 @ResponseBody的区别为 @ResponseBody三种的对比
2. SpringBoot 自动装配
2.1 pom.xml
- spring-boot-dependencies: 核心依赖在父工程中
- 我们在写或者引入一些springboot依赖的时候,不需要指定版本,就因为有这些版本仓库
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.14</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.crevew</groupId> <artifactId>springboot-02-config</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-02-config</name> <description>springboot-02-config</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.2 启动器Starter
- 说明了就是Springboot的启动场景,比如说: spring-boot-starter-web,就是帮我们自动导入web环境所有的依赖
- springboot会将所有的功能场景,都变成一个个的启动器
- 我们要使用什么功能,只需要找到对应的启动器就可以了,启动器列表为: Spring Boot Reference Documentation
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.3 主程序
- @SpringBootApplication: 标注这个类是一个springboot的应用,包括
- @SpringBootConfiguration
- @Configuration: Spring配置类
- @Component: 说明这也是一个spring的组件
- @EnableAutoConfiguration:自动配置
- @AutoConfigurationPackage: 自动配置包
- @Import(AutoConfigurationPackages.Registrar.class): 自动配置,包注册
- @Import(AutoConfigurationImportSelector.class): 自动配置导入选择
- @AutoConfigurationPackage: 自动配置包
- @SpringBootConfiguration
- SpringApplication.run(): 将springboot应用启动
2.3.1 @SpringBootApplication分析

结论:springboot所有自动配置都是在启动的时候扫描并加载,org.springframework.boot:spring-bot-autoconfigure/META-INF/spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的starter,就有对应的启动了,有了启动器,我们自动装配就会身高,然后就配置成功。
- springboot在启动的时候,从类路劲下 /META-INF/spring.factories获取指定的值;
- 将这些自动配置的类导入容器,自动配置就会生效,帮我们进行自动配置;
- 以前我们需要自动配置的东西,现在springboot帮我们做了;
- 整个JavaEE,解决方案和自动配置的东西都在spring-boot-autoconfig....jar 这个包下;
- 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;
- 容器中也会存在非常多的xxxAutoConfiguration的文件,就是这些类给容器中导入了这个场景所需要的所有组件,并自动配置 @Configuration
- 有了自动配置类,免去了我们手动编写配置文件的工作。
2.3.2 SpringApplication.run() 分析
这个类主要做了一下四件事情:
- 推断应用的类型是普通的项目还是Web项目
- 查找并加载所有可用初始化器,设置到initializers属性中
- 找出所有的应用程序监听器,设置到listenners属性中
- 推断并设置main方法的定义类,找到运行的主类


3. SpringBoot 配置文件
完整配置项清单,详见: Common Application Properties (spring.io)
SpringBoot Starter,详见: Developing with Spring Boot
yaml可以给实体类赋值. 关于Java类赋值的几种方式:
- Java, new出一个对象赋值
- Spring, applicationContext.xml文件 (Bean,properties注入)
- Spring, @Value, 注解注入, @Autowired
- SpringBoot,@ConfigurationProperties (Spring Boot application.yaml注入), @Autowired,此种方式下,yaml文件里面可以包括EL表达式,非常强大
- SpringBoot, @PropertySource (Spring Boot properties注入),@Autowired
|
Spring Boot @ConfigurationProperties |
Spring @Value |
|
| 功能 | 批量注入配置文件中的属性 | 一个个指定 |
| 松散绑定(松散语法) | 支持 | 不支持 |
| SpEL | 不支持 | 支持 |
| JSR303数据校验 | 支持 | 不支持 |
| 复杂类型封装 | 支持 | 不支持 |
结论:
- 配置yml和配置properties都可以获取到值,强烈推荐yaml
- 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@value
- 如果我们专门编写了一个JavaBean来和配置文件进行映射,就直接使用@ConfigurationProperties,不要犹豫
JSR303校验
引入@Validated之后,@Email仍然报红色,解决方案是 @ JSR303数据校验中@Email爆红问题解决
JSR303的定义如下: @ (17条消息) JSR-303_jsr303是什么
4. Spring Boot Web开发
需要解决的问题是:
- 导入静态资源
- 首页
- jsp,模版引擎Thymeleaf
- 装配扩展SpringMVC
- 增删改查
- 拦截器
- 国际化
4.1 静态资源加载方式
在Springboot中,可以使用一下方式处理静态资源
- Webjars: webjars 官网 @ WebJars - Web Libraries in Jars
- classpath:/META-INF/resources/ > classpath:/resources/ > classpath:/static (默认) > classpath:/public/ (按照优先级排序)
4.2 首页加载
首页index.html放在 resource > static > public下,如果放在templates下午,需要在controller里面做映射。
4.3 模版引擎
前端交给我们的页面,是html页面。如果是我们以前开发,我们需要把他们转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面以后,我们可以用jsp轻松实现数据的显示,及交互等。jsp支持非常强大的功能,包括能写Java代码;但是呢,我们现在的这种情况,SpringBoot这个项目首先是以jar的方式,不是war;第二,我们用的还是嵌入式的Tomcat,所以呢,他现在默认是不支持jsp的。
那不支持jsp,如果我们直接用纯静态页面的方式,那给我们开发会带来非常大的麻烦,那怎么办呢?SpringBoot推荐你可以来使用模版引擎。
那么这模版引擎,我们其实大家听到很多,其实jsp就是一个模版引擎,还有以前用的比较多的freemarker,包括SpringBoot给我们推荐的Thymeleaf,模版引擎有非常多,但再多的模版引擎,他们的思想都是一样的,什么样一个思想呢?

Thymeleaf 官网: Thymeleaf, GitHub: Thymeleaf · GitHub
4.4 SpringMVC 自动配置
SpringBoot对我们的SpringMVC还做了一些配置,包括扩展,定制等。
SpringMVC 官方文档 @ Web (spring.io)
在springboot中,有非常多的xxxConfiguration帮助我们进行扩展配置,只要看见这个东西,我们就要注意。
5. 员工管理系统
员工管理系统源码下载 @ (狂神说)员工管理系统(静态资源+完整代码)
1. 所有页面的静态资源,都需要Thymeleaf接管;
2. 页面国际化: (1). 需要配置i18n文件;(2). 如果在项目中需要进行按钮自动切换,则需要自定义一个组件LocaleResolver; (3) 记得通过@Bean将自己写的组件配置到Spring容器 。 (4) 通过#{}取得国际化的消息。
3. 登录与拦截器
4. CRUD 增删改查
提取公共页面 (th:fragment="sidebar", th:repace, th:insert), 如果需要传参则需要用()传参
x-admin: 后台管理模版
bootstrap, lay-ui: 前端管理
6. JDBC/DRUID/Mybatis
DRUID @ druid-spring-boot-starter的使用方法
Mybatis 只能采用2.3.1 版本 @ Maven Repository:mybatis-spring-boot-starter
7. 安全Shiro/Spring Security
Shiro, Spring Security 很像,除了类不一样,名字不一样;其他基本一致,包括:认证,授权
代码静态资源: 狂神Springboot视频中的SpringSecurity静态资源
如果遇到Spring Security默认的login页面加载时间过长,是因为bootstrap.min.cs 文件无法下载,需要FQ,请打卡VPN;或者直接下载css文件即可
7.1 Spring Security
Spring Security 是针对Spring项目的安全框架,也是SpringBoot底层安全模块默认的技术选型,可以实现强大的Web安全控制,对于其使用,只要少量的配置,即可使用。
记住几个类:
- WebSecurityConfigurerAdapter: 自定义Security策略
- AuthenticationManagerBuilder: 自定义认证策略
- @EnableWebSecurity: 开启WebSecurity模式
Spring Security 内部功能详解为: SpringSecurity学习
Spring Security如果没有任何配置,会自动enable user login 账户,可以去除,方法为:This generated password is for development use only.
Spring & Thymeleaf, 必须使用 3.0.5 RELEASE或者更低版本。 thymeleaf-extras-springsecurity5
同时,关于角色role不匹配的问题,详见: (18条消息) SpringBoot---spring-security配置问题_记录菌的博客-CSDN博客
7.2 Shiro
Apach Shiro ,按照GitHub samples/quickstart里面的配置,拷贝后发现编译出错,原因是: (18条消息) shiro报错:import org.apache.shiro.ini.IniSecurityManagerFactory出错;报Cannot resolve symbol ‘ini_cannot resolve org.apache.shiro:shiro-core:1.12.1_普通网友的博客-CSDN博客
8. Swagger
8.1 背景
背景,前后端联调的解决方案,指定schedule,实时更新API,降低集成的风险。
早些年:制定word文档
后来采用:
- 前端测试后端接口:postman
- 后端提供接口,需要实时更新最新的消息及改动
Swagger,号称世界上最流行的API框架, Restful,文档在线自动生成工具,直接运行,支持多种语言等 官网:https://swagger.io
8.2 项目使用Swagger
项目中使用,需要Springfox: swagger2, UI
导入POM的包依赖,以及版本对应关系,以及配置,详见 @Springboot Swagger各版本整理_springboot和swagger版本
访问管理页面: http://localhost:8080/swagger-ui/index.html#/
8.3 配置扫描接口
通过写一个SwaggerConfig类来控制Docket操作
总结:
1. 我们可以通过Swagger给一些比较难以理解的属性或者接口,增加注释信息;
2. 接口文档实时更新
3. 可以在线测试
Swagger是一个优秀的工具,几乎所有大公司都在用。
【注意】在正式发布的时候,关闭Swagger;不仅仅出于安全,也是节省内存。
9. 邮件/异步/调度
异步:@Async @EnableAsync
邮件系统POM需要加载一个starter即可
定时有以下调度函数
- TaskScheduler 任务调度者
- TaskExecutor 任务执行者
- @EnableScheduling 开启定时功能的注解
- @Scheduled 什么时候执行
- Cron表达式
10. 分布式+Dubbo+ZooKeeper
10.1 安装配置
Apach Dubbo (alibaba) --- RPC @ Apache Dubbo (下载路径@版本发布 | Apache Dubbo)
ZooKeeper @ Apache ZooKeeper (下载路径),配置.\config\zoo.cfg文件,并且加入“ admin.serverPort=8060 ” 修改端口号到8060,否则容易和其他的冲突

Dubbo+ZooKeeper vs. Spring Cloud 比较 @ dubbo和spring cloud区别 • Worktile社区
10.2 运行
ZooKeeper直接运行就可以使用了,注意修改8080端口号为8060,.\conf\zoo.cfg 文件中修改
Dubbo需要自己编译,编译步骤和启动步骤如下,然后通过 localhost:8080 登录,用户名密码 root/root
>cd D:\environ\apache-dubbo-admin-0.4.0-source-release
>mvn clean package -Dmaven.test.skip=true
等待12分钟,即可编译完成,最后完成界面如下:
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for dubbo-admin 0.4.0:
[INFO]
[INFO] dubbo-admin ........................................ SUCCESS [01:36 min]
[INFO] dubbo-admin-ui ..................................... SUCCESS [07:11 min]
[INFO] dubbo-admin-server ................................. SUCCESS [01:34 min]
[INFO] dubbo-admin-distribution ........................... SUCCESS [ 2.052 s]
[INFO] dubbo-admin-test ................................... SUCCESS [ 38.054 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11:13 min
[INFO] Finished at: 2023-08-02T17:28:50+08:00
[INFO] ------------------------------------------------------------------------
Zookeeper: 注册中心
dubbo-admin: 是一个监控管理后台,查看我们注册了哪些服务,哪些服务被消费了;可以不要的,非核心组件
dubbo:是一个jar包,从maven下载
POM比较特殊
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.14</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.crevew</groupId> <artifactId>consumer-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>consumer-server</name> <description>consumer-server</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- //导入依赖--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId> dubbo-spring-boot-starter</artifactId> <version>3.2.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- 日志会冲突--> <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.5.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.5.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-x-discovery --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-x-discovery</artifactId> <version>5.5.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.8.2</version> <!-- 排除这个slf4j-log4j12--> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
11. 微服务扩展
11.1 主流微服务框架
1. Spring Cloud NetFlix 一站式解决方案
- API网关,Zuul组件
- 通信,Feign, HttpClient, Http通信方式,同步并阻塞
- 服务注册与发现,Eureka
- 熔断机制,Hystrix
2. Apache Dubbo, Zookeeper 解决方案
- API: 没有
- 通信: Zubbo, 高性能的基于Java实现的RPC通信框架
- 服务注册与发现: zookeeper (Hadoop, Hive etc.)
- 熔断机制: 没有,借助Hystrix
3. Spring Cloud Alibaba,一站式解决方案
11.2 服务网格
目前,又提出了一种方案,服务网格 (下一代微服务标准)Server Mesh。代表的解决方案是 istio
总结:万变不离其宗,一通百通!
- 1. API网关,服务路由
- 2. HTTP,RPC框架,异步调用
- 3. 服务注册与发现,高可用
- 4. 熔断机制,服务降级
基于这四个问题,就可以开发出一套解决方案。
浙公网安备 33010602011771号