Spring Boot快速入门
Spring Boot 概述
Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-based applications. Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring.
引自官网的一段话,大概是说:Spring Boot是所有基于Spring开发的项目的起点。Spring Boot的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。
优势:简单、快速、方便地搭建项目;对主流开发框架的无配置集成;极大提高了开发、部署效率。
Spring Boot 快速搭建
新建项目
New -> Project -> Spring Initializr -> 选择默认的url -> 配置项目信息Group和Artifact -> Dependencies选择Web,并勾选上Web模板 -> 选择好项目位置
建议勾选的依赖:
- Web -> Web
- Template -> Freemaker
- SQL -> MySQL
- SQL ->MyBatis
如果是第一次配置Spring Boot可能需要等待一会IDEA下载相应的依赖包,默认创建好的项目结构如下:
SpringbootApplication
:一个带有 main()方法的类,用于启动应用程序SpringbootApplicationTests
:一个空的Junit测试类,它加载了一个使用Spring Boot字典配置功能的Spring应用程序上下文application.properties
:一个空的properties文件,可以根据需要添加配置属性pom.xml
:Maven构建说明文件
目录结果
Spring Boot建议的目录结果如下:
com
+- example
+- myproject
+- Application.java
|
+- model
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- controller
| +- CustomerController.java
|
Application.java
建议放到根目录下面,主要用于做一些框架配置model
目录主要用于实体与数据访问层(Repository)service
层主要是业务类代码controller
负责页面访问控制
引入 web 模块
pom.xml中添加支持web的模块:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
pom.xml 文件中默认有两个模块:
spring-boot-starter
:核心模块,包括自动配置支持、日志和 YAML,如果引入了spring-boot-starter-web
,web 模块可以去掉此配置,因为spring-boot-starter-web
自动依赖了spring-boot-starter
spring-boot-starter-test
:测试模块,包括 JUnit、Hamcrest、Mockito
HelloController
package cn.appblog.springboot;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "Hello Spring Boot!";
}
}
@RestController 注解:该注解是 @Controller 和 @ResponseBody 注解的合体版
利用 IDEA 启动 Spring Boot
回到SpringbootApplication这个类中,然后右键点击Run 'SpringbootApplication'运行:
注意:之所以在上面的项目中没有手动的去配置Tomcat服务器,是因为Spring Boot内置了Tomcat
等待一会儿就会看到下方的成功运行的提示信息:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.3.RELEASE)
...
Tomcat started on port(s): 8080 (http) with context path ''
Started SpringbootApplication in 2.711 seconds (JVM running for 4.294)
Initializing Spring DispatcherServlet 'dispatcherServlet'
Initializing Servlet 'dispatcherServlet'
Completed initialization in 10 ms
可以看到Tomcat运行在8080端口,访问/hello
地址即可:http://localhost:8080/hello
单元测试
打开的src/test/下的测试入口,编写简单的 http 请求来测试;使用 mockmvc 进行,利用MockMvcResultHandlers.print()打印出执行结果。
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.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@RunWith(SpringRunner.class)
public class HelloTest {
private MockMvc mvc;
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
}
@Test
public void getHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo("Hello World")));
}
}
解析Spring Boot项目
解析 pom.xml 文件
默认生成的pom.xml文件中可以看到一个比较陌生的标签<parent>
,这个标签是在配置Spring Boot的父级依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
有了这个配置,当前的项目才是Spring Boot项目,spring-boot-starter-parent
是一个特殊的starter,它用来提供相关的Maven默认依赖,使用它之后,常用的包依赖就可以省去version标签。
关于具体Spring Boot提供了哪些jar包的依赖,我们可以查看本地Maven仓库下:\repository\org\springframework\boot\spring-boot-dependencies\2.1.3.RELEASE\spring-boot-dependencies-2.1.3.RELEASE.pom
文件来查看
应用入口类
Spring Boot项目通常有一个名为 *Application 的入口类,入口类里有一个main方法, 这个main方法其实就是一个标准的Java应用的入口方法。
@SpringBootApplication
是Spring Boot的核心注解,它是一个组合注解,该注解组合了:@Configuration
、@EnableAutoConfiguration
、@ComponentScan
;若不是用 @SpringBootApplication
注解也可以使用这三个注解代替。
其中,@EnableAutoConfiguration
让Spring Boot根据类路径中的jar包依赖为当前项目进行自动配置,例如,添加了spring-boot-starter-web
依赖,会自动添加Tomcat和Spring MVC的依赖,那么Spring Boot会对Tomcat和Spring MVC进行自动配置。
Spring Boot还会自动扫描@SpringBootApplication
所在类的同级包以及下级包里的Bean,所以入口类建议就配置在grounpID + arctifactID
组合的包名下(这里为 cn.appblog.springboot 包)
Spring Boot的配置文件
application.properties
与application.yml
Spring Boot使用一个全局的配置文件application.properties
或application.yml
,放置在src/main/resources
目录或者类路径的/config
下。
Spring Boot不仅支持常规的properties
配置文件,还支持yaml
语言的配置文件。yaml
是以数据为中心的语言,在配置数据的时候具有面向对象的特征。
Spring Boot的全局配置文件的作用是对一些默认配置的配置值进行修改
例如同样将Tomcat默认端口设置为8080,并将默认的访问路径从/
修改为/hello
时,使用properties
文件和yml
文件的区别:
application.properties
server.port=8080
server.servlet.context-path=/appblog
application.yml
server:
port: 8080
servlet:
context-path: /appblog
重启Spring Boot,输入URL:http://localhost:8080/appblog/hello
注意:yml
需要在:
后加一个空格,幸好IDEA很好地支持了yml
文件的格式有良好的代码提示
配置多个属性
我们直接把.properties
后缀的文件删掉,使用.yml
文件来进行简单的配置,然后使用@Value
来获取配置属性:
server:
port: 8080
servlet:
context-path: /
name: Joe.Ye
age: 28
@RestController
public class HelloController {
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
@RequestMapping("/hello")
public String hello() {
return "name:" + name + ", " + "age:" + age;
}
}
重启Spring Boot,输入URL:http://localhost:8080/hello
也可以在配置文件中使用当前配置:
server:
port: 8080
servlet:
context-path: /
name: Joe.Ye
age: 28
content: "name:${name}, age:${age}"
@RestController
public class HelloController {
@Value("${content}")
private String content;
@RequestMapping("/hello")
public String hello() {
return content;
}
}
封装配置信息
问题:如上写配置文件繁琐而且可能会造成类的臃肿,因为有许许多多的@Value
注解。
我们可以把配置信息封装成一个类,首先在我们的name
和age
前加一个person
前缀,然后新建一个Person
类用来封装这些信息,并用上两个注解:
@Component
:表明当前类是一个Java Bean@ConfigurationProperties(prefix = "person")
:表示获取前缀为person
的配置信息
server:
port: 8080
servlet:
context-path: /
person:
name: Joe.Ye
age: 28
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
@RestController
public class HelloController {
@Autowired
private Person person;
@RequestMapping("/hello")
public String hello() {
return "name:" + person.getName() + ", age:" + person.getAge();
}
}
Spring Boot热部署
IDEA配置热部署
(1)File
-> Settings
-> Compiler
-> 勾选Build project automatically
(2)快捷键Ctrl+Shift+Alt+/
-> 选中Registry -> 勾选compiler.automake.allow.when.app.running
(3)重启IDEA
(4)Chrome浏览器中按F12 -> Disable cache
Spring Boot配置热部署
在目前的Spring Boot项目中,当发生任何修改之后我们都需要重新启动才能够查看效果,这样会略显麻烦,Spring Boot提供了热部署的方式,当发现任何类发生改变,就会通过JVM类加载的方式,加载最新的类到虚拟机中,不需要重启也能看到修改后的效果。
在pom.xml
中添加一个依赖即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 需要为true热部署才有效 -->
</dependency>
重新启动Spring Boot,然后修改任意代码,就能观察到控制台的自动重启现象。
Spring Boot使用
Spring Boot支持JSP
Spring Boot的默认视图支持是Thymeleaf
模板引擎,我们还是想要使用JSP怎么办呢?
(1)修改pom.xml
增加对JSP文件的支持
<!-- servlet依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat的支持.-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
(2)配置试图重定向JSP文件的位置
修改application.yml
文件,将JSP文件重定向到/WEB-INF/views/
目录下:
spring:
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
(3)修改 HelloController
修改@RestController
注解为@Controller
,然后将hello
方法修改为:
(4)新建 hello.jsp 文件
在src/main
目录下依次创建webapp/WEB-INF/views
目录,并创建一个hello.jsp
文件:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
Hello, Joe.Ye. 现在时间是${now}
(5)热部署完毕刷新网页
若报如下错误:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri Mar 08 17:13:32 CST 2019
There was an unexpected error (type=Not Found, status=404).
No message available
则停止运行应用,再使用Maven插件spring-boot:run
(Plugins
-> spring-boot
-> spring-boot:run
)运行项目可以解决
修改Spring Boot内嵌Tomcat运行环境
@Bean
public WebServerFactoryCustomizer webServerFactoryCustomizer(){
return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
factory.setPort(8090); //默认8080
factory.setDocumentRoot(new File("src/main/appblog")); //默认src/main/webapp
}
};
}
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/04/01/spring-boot-quick-start/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论