一、 Spring Boot 介绍
1 什么是 Spring Boot
2 Spring Boot 特征
- 使用 Spring Boot 可以创建独立的 Spring 应用程序
- 在Spring Boot中直接嵌入了Tomcat、Jetty、Undertow等Web容器,所以在使用SpringBoot 做 Web 开发时不需要部署 WAR 文件
- 通过提供自己的启动器(Starter)依赖,简化项目构建配置
- 尽量的自动配置 Spring 和第三方库
- 提供了生产就绪特征,如:度量指标,运行状况检查和外部化配置
- 绝对没有代码生成,也不需要 XML 配置文件
3 Spring Boot 版本介绍
SNAPSHOT:快照版,即开发版。
CURRENT:最新版,但是不一定是稳定版。
GA:General Availability,正式发布的版本。
二、 创建基于 Spring Boot 的项目
1 通过官网创建项目
- 首先进入spring的网站https://start.spring.io/
这个是一个偏向简洁默认的一个方式,也可以点击“switch to the full version”,那样能够看到所有配置的选项。
我们输入好之后可以点击“Generate Project”即可。
-
解压下载的zip文件到指定的工作目录。
-
使用idea,以导入maven项目的方式导入刚刚解压开的项目。
-
添加一个简单的controller
@RestController
@RequestMapping("/first")
public class FirstController {
@Autowired
private DemoConfig demoConfig;
@RequestMapping("/test")
public String firsttest() {
return "firestTest";
}
}
- 利用springboot的maven启动插件启动spring boot应用。
- 运行后访问接口,验证是否正确。
2 通过 IDEA 的脚手架工具创建(个人推荐)
3 通过 IDEA 的 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjsxt</groupId>
<artifactId>springbootdemo3</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
三、 Spring Boot 项目结构介绍
1 POM 文件
1.1 继承
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Spring Boot 的父级依赖,只有继承它项目才是 Spring Boot 项目。 spring-boot-starter-parent 是一个特殊的 starter,它用来提供相关的 Maven 默认依赖。使 用它之后,常用的包依赖可以省去 version 标签。
1.2依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
启动器依赖
1.3插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
spring-boot-maven-plugin 插件是将 springboot 的应用程序打包成 jar 包的插件。将所有 应用启动运行所需要的 jar 包都包含进来,从逻辑上将具备了独立运行的条件。当运行"mvn package"进行打包后,使用"java -jar"命令就可以直接运行。
2 启动类
Spring Boot 的启动类的作用是启动 Spring Boot 项目,是基于 Main 方法来运行的。
注意:启动类在启动时会做注解扫描(@Controller、@Service、@Repository…),扫描 位置为同包或者子包下的注解,所以启动类的位置应放于包的根下。
2.1 启动类与启动器区别:
- 启动类表示项目的启动入口
- 启动器表示 jar 包的坐标
2.2 创建启动类
@SpringBootApplication
public class SpringBootDemo3Application {
public static void main(String[] args){
SpringApplication.run(SpringBootDemo3Application.class,ar gs);
}
}
3 启动器
Spring Boot 将所有的功能场景都抽取出来,做成一个个的 starter(启动器),只需要在项 目里面引入这些 starter 相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景, 在 jar 包管理上非常方便,最终实现一站式开发。
Spring Boot 提供了多达 44 个启动器。
1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。
2)spring-boot-starter-actuator 帮助监控和管理应用。
3)spring-boot-starter-amqp 通过spring-rabbit来支持AMQP协议(Advanced Message Queuing Protocol)。
4)spring-boot-starter-aop 支持面向方面的编程即AOP,包括spring-aop和AspectJ。
5)spring-boot-starter-artemis 通过Apache Artemis支持JMS的API(Java Message Service API)。
6)spring-boot-starter-batch 支持Spring Batch,包括HSQLDB数据库。
7)spring-boot-starter-cache 支持Spring的Cache抽象。
8)spring-boot-starter-cloud-connectors 支持Spring Cloud Connectors,简化了在像Cloud Foundry或Heroku这样的云平台上连接服务。
9)spring-boot-starter-data-elasticsearch 支持ElasticSearch搜索和分析引擎,包括spring-data-elasticsearch。
10)spring-boot-starter-data-gemfire 支持GemFire分布式数据存储,包括spring-data-gemfire。
11)spring-boot-starter-data-jpa 支持JPA(Java Persistence API),包括spring-data-jpa、spring-orm、hibernate。
12)spring-boot-starter-data-MongoDB 支持MongoDB数据,包括spring-data-mongodb。
13)spring-boot-starter-data-rest 通过spring-data-rest-webmvc,支持通过REST暴露Spring Data数据仓库。
14)spring-boot-starter-data-solr 支持Apache Solr搜索平台,包括spring-data-solr。
15)spring-boot-starter-freemarker 支持FreeMarker模板引擎。
16)spring-boot-starter-groovy-templates 支持Groovy模板引擎。
17)spring-boot-starter-hateoas 通过spring-hateoas支持基于HATEOAS的RESTful Web服务。
18)spring-boot-starter-hornetq 通过HornetQ支持JMS。
19)spring-boot-starter-integration 支持通用的spring-integration模块。
20)spring-boot-starter-jdbc 支持JDBC数据库。
21)spring-boot-starter-jersey 支持Jersey RESTful Web服务框架。
22)spring-boot-starter-jta-atomikos 通过Atomikos支持JTA分布式事务处理。
23)spring-boot-starter-jta-bitronix 通过Bitronix支持JTA分布式事务处理。
24)spring-boot-starter-mail 支持javax.mail模块。
25)spring-boot-starter-mobile 支持spring-mobile。
26)spring-boot-starter-mustache 支持Mustache模板引擎。
27)spring-boot-starter-Redis 支持Redis键值存储数据库,包括spring-redis。
28)spring-boot-starter-security 支持spring-security。
29)spring-boot-starter-social-facebook 支持spring-social-facebook
30)spring-boot-starter-social-linkedin 支持pring-social-linkedin
31)spring-boot-starter-social-twitter 支持pring-social-twitter
32)spring-boot-starter-test 支持常规的测试依赖,包括JUnit、Hamcrest、Mockito以及spring-test模块。
33)spring-boot-starter-thymeleaf 支持Thymeleaf模板引擎,包括与Spring的集成。
34)spring-boot-starter-velocity 支持Velocity模板引擎。
35)spring-boot-starter-web S支持全栈式Web开发,包括Tomcat和spring-webmvc。
36)spring-boot-starter-websocket 支持WebSocket开发。
37)spring-boot-starter-ws 支持Spring Web Services。
Spring Boot应用启动器面向生产环境的还有2种,具体如下:
38)spring-boot-starter-actuator 增加了面向产品上线相关的功能,比如测量和监控。
39)spring-boot-starter-remote-shell 增加了远程ssh shell的支持。
最后,Spring Boot应用启动器还有一些替换技术的启动器,具体如下:
40)spring-boot-starter-jetty 引入了Jetty HTTP引擎(用于替换Tomcat)。
41)spring-boot-starter-log4j 支持Log4J日志框架。
42)spring-boot-starter-logging 引入了Spring Boot默认的日志框架Logback。
43)spring-boot-starter-tomcat 引入了Spring Boot默认的HTTP引擎Tomcat。
44)spring-boot-starter-undertow 引入了Undertow HTTP引擎(用于替换Tomcat)。
4 配置文件
Spring Boot 提供一个名称为 application 的全局配置文件,支持两种格式 properteis 格式 与 YAML 格式。
4.1 Properties 格式
配置 Tomcat 监听端口
server.port=8888
4.2YAML 格式
YAML 格式配置文件的扩展名可以是 yaml 或者 yml。
4.2.1基本格式要求
- 大小写敏感
- 使用缩进代表层级关系
- 相同的部分只出现一次
配置 Tomcat 监听端口
server:
port: 8888
4.3配置文件存放位置
当前项目根目录中
当前项目根目录下的一个/config 子目录中
项目的 resources 即 classpath 根路径中
项目的 resources 即 classpath 根路径下的/config 目录中
4.4配置文件加载顺序
4.4.1不同格式的加载顺序
如 果 同 一 个 目 录 下 , 有 application.yml 也 有 application.properties , 默 认 先 读 取 application.properties。
如果同一个配置属性,在多个配置文件都配置了,默认使用第 1 个读取到的,后面读取 的不覆盖前面读取到的。
4.4.2不同位置的加载顺序
分别的默认命名为:application.yml、application.properties 官网都是以yml作为参考,层级结构更清晰的一种配置文件。
–file:./config/
–file:./
–classpath:/config/
–classpath:/
SpringBoot配置文件默认可以放到以下目录中,下面四种可以自动读取到:
1、项目根目录下
2、项目根目录中config目录下
3、项目的resources目录下
4、项目resources目录中config目录下
以上的application.properties优先级都要大于application.yml的哈,然后再按照那个顺序。
如果在不同的目录中存在多个配置文件,它的读取顺序是:
1、config/application.properties(项目根目录中config目录下)
2、config/application.yml
3、application.properties(项目根目录下)
4、application.yml
5、resources/config/application.properties(项目resources目录中config目录下)
6、resources/config/application.yml
7、resources/application.properties(项目的resources目录下)
8、resources/application.yml
注意
1、如果同一个目录下,有application.yml也有application.properties,默认先读取application.properties。
2、如果同一个配置属性,在多个配置文件都配置了,默认使用第1次读取到的,后面读取的不覆盖前面读取到的。
3、创建SpringBoot项目时,一般的配置文件放置在“项目的resources目录下”
如果是其他名称的配置文件也可以在启动的时候配置:–spring.config.name = aaa 来加载aaa配置文件,或者通过–spring.config.location来加载不同目录的配置文件。在初期需要根据 spring.config.name 和 spring.config.location 决定加载哪个文件,所以它们必须定义为environment属性(通常为OS env,系统属性或命令行参数 )或者我们可以通过springboot的main 里面写代码或者是注解来实现指定配置,多种多个配置文件的效果。
4.5配置文件中的占位符
4.5.1占位符语法
语法:${}
4.5.2占位符作用
"${}"中可以获取框架提供的方法中的值如:random.int 等。
占位符可以获取配置文件中的键的值赋给另一个键作为值。
4.5.3生成随机数
${random.value} - 类似 uuid 的随机数,没有"-"连接
${random.int} - 随机取整型范围内的一个值
${random.long} - 随机取长整型范围内的一个值
${random.long(100,200)} - 随机生成长整型 100-200 范围内的一个值
${random.uuid} - 生成一个 uuid,有短杠连接
${random.int(10)} - 随机生成一个 10 以内的数
${random.int(100,200)} - 随机生成一个 100-200 范围以内的数
4.6bootstrap 配置文件
4.6.1bootstrap 配置文件介绍
Spring Boot 中有两种上下文对象,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从 额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一 个环境,它是任何 Spring 应用程序的外部属性的来源。bootstrap 里面的属性会优先加载, 它们默认也不能被本地相同配置覆盖。
4.6.2bootstrap 配置文件特征
boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载。
boostrap 里面的属性不能被覆盖。
4.6.3bootstrap 与 application 的应用场景
application 配置文件主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。
使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息。
一些固定的不能被覆盖的属性。
一些加密/解密的场景。
5 Spring Boot 的核心注解
5.1@SpringBootApplication
是 SpringBoot 的启动类。 此注解等同于@Configuration+@EnableAutoConfiguration+@ComponentScan 的组合。
5.2@SpringBootConfiguration
@SpringBootConfiguration 注解是@Configuration 注解的派生注解,跟@Configuration 注解的功能一致,标注这个类是一个配置类,只不过@SpringBootConfiguration 是 springboot 的注解,而@Configuration 是 spring 的注解
5.3@Configuration
通过对 bean 对象的操作替代 spring 中 xml 文件
5.4@EnableAutoConfiguration
Spring Boot 自动配置(auto-configuration):尝试根据你添加的 jar 依赖自动配置你的 Spring 应用。是@AutoConfigurationPackage 和@Import(AutoConfigurationImportSelector.class) 注解的组合。
5.5@AutoConfigurationPackage
@AutoConfigurationPackage 注解,自动注入主类下所在包下所有的加了注解的类 (@Controller,@Service 等),以及配置类(@Configuration)
5.6@Import({AutoConfigurationImportSelector.class})
直接导入普通的类
导入实现了 ImportSelector 接口的类
导入实现了 ImportBeanDefinitionRegistrar 接口的类
5.7@ComponentScan
组件扫描,可自动发现和装配一些 Bean。
5.8@ConfigurationPropertiesScan
@ConfigurationPropertiesScan 扫描配置属性。@EnableConfigurationProperties 注解的作 用是使用 @ConfigurationProperties 注解的类生效。
四、 编写 HelloWorld
1 使用IDEA 创建项目
1)File>New>Project,如下图选择Spring Initializr 然后点击 【Next】下一步
2)填写GroupId(包名)、Artifact(项目名) 即可。
groupId=com.fishpro
artifactId=springstudy
3)选择依赖,我们选择Web
2.配置Pom.xml
注意如果生成项目的时候没有设置Dependencies,选择web,那么这里要在Pom.xml中设置,Pom.xml设置依赖也非常的简单,直接把 的节点拷贝到pom依赖节点中即可。
Pom.xml属于maven项目结构的项目依赖项配置文件,主要管理第三方包的引用。
默认项目配置了spring-boot-starter和spring-boot-starter-test ,配置如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
因为示例项目是web项目所以需要引入web模块,在dependency下增加节点,增加后如下:
<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>
注意,如果IDEA没有自动导入,那么前往右下角,点击【Import Changes】
有的时候会出问题了!
1.Failed to read artifact descriptor for org.springframework.boot:spring-boot-starter-web:jar:2.1.4.RELEASE less… (⌘F1)
Inspects a Maven model for resolution problems.
未能加载spring-boot-starter-web:jar,这个应该是mvn管理器加载问题。去掉里面依赖
答:spring boot 2.1.4的mvn有问题,改成2.0.0就好了。当然这可能是其他原因,我使用IDEA创建的项目就没有这个问题。
3.编写代码
3.1 Web项目的常用目录结构
通常,我们使用三层结构来编写。
应用层(Controller)、服务层(Service)、数据层(Dao)
我们也增加对应的包目录。
3.2 增加Controller包
1)在本示例中,右键springstudy包名,新建包名 controller (注意一般是消息)
2)在controller下新建HelloWorldController.java (注意首字母大写)
3)在HelloWorldController中增加java代码
@RestController
@RequestMapping("/hello")
public class HelloWorldController {
@RequestMapping("/say")
public String say(){
return "Hello World";
}
}
3.3 更改Web端口
因我的系统端口默认8080倍nginx占领了,我把本次项目的启动端口改为8999
在 resources\application.properties 中设置(注意有的网络教程中是 application.yml 其实这是另一种配置文件格式,就想json和xml 只是格式不同,功能作用一样)
#设置端口号
server.port=8999
4.编写测试代码
测试代码在 src\test\java下面编写
1)在本示例中,右键 src\test\java\com\fishpro\springstudy包名,新建包名 controller (注意一般是消息)
2)在controller下新建HelloWorldControllerTests.java (注意对应于main下,一般后缀Tests)
3)在HelloWorldControllerTests中增加java代码
package com.fishpro.springstudy.controller;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloWorldControllerTests {
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();
}
@Test
public void getHello() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/hello/say").accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
}
5.运行
5.1 运行程序或调试程序
点击右上角,绿色运行三角形按钮,启动运行,或点击它旁边的爬虫按钮,进行调试。
或者点击菜单
Run>Run ‘SpringstudyApplication’
Run>Debug ‘SpringstudyApplication’
浏览器输入 http://localhost:8999/hello/say
6.打包发布
通常我们一jar方式打包发布,war方式用于单独的发布到已有的tomcat web服务器中,以后的实践中再讲。
1)选择 View> Tool Windows>Terminal
2)输入命令
mvn clean
mvn install
在根目录下有个target 文件夹,
3)模拟服务器环境,运行jar文件,输入命令,后则可以在浏览器中得到结果。
java -jar springstudy-0.0.1-SNAPSHOT.jar
总之,Spring Boot是一个优秀的实战型框架,他既简单又强大。