一、概述
-
目的
- Spring Boot的主要目的是简化Spring应用程序的初始搭建以及开发过程。它采用了“约定优于配置”的原则,减少了开发人员需要编写的样板代码(如配置文件)数量。例如,在传统的Spring应用中,要配置一个数据源,需要在XML配置文件或者Java配置类中进行大量的配置,包括数据库连接URL、用户名、密码等。而在Spring Boot中,只要在
application.properties
或application.yml
文件中简单地配置几行属性,就可以自动配置好数据源。
- Spring Boot的主要目的是简化Spring应用程序的初始搭建以及开发过程。它采用了“约定优于配置”的原则,减少了开发人员需要编写的样板代码(如配置文件)数量。例如,在传统的Spring应用中,要配置一个数据源,需要在XML配置文件或者Java配置类中进行大量的配置,包括数据库连接URL、用户名、密码等。而在Spring Boot中,只要在
-
优势
- 快速启动:可以通过Spring Initializr(https://start.spring.io/)快速创建一个Spring Boot项目的基础结构,包括项目的目录结构、依赖管理等。这使得开发者可以在短时间内开始编写业务逻辑代码。
- 自动配置:根据项目中添加的依赖,Spring Boot会自动配置许多组件。比如,当你添加了
spring - web
依赖,它会自动配置一个嵌入式的Tomcat服务器,并且配置好Spring MVC的相关组件,使你能够轻松地开发Web应用。 - 易于部署:可以将Spring Boot应用打包成一个可执行的JAR文件,这个JAR文件包含了所有运行应用所需的依赖(通过Maven或Gradle的插件实现)。这使得在不同的环境(如开发环境、测试环境、生产环境)中部署应用变得非常方便,只需要一个Java运行时环境就可以运行应用。
-
版本历史
- Spring Boot的版本更新较为频繁。从早期版本到现在,它不断增加新的功能和优化。例如,在较新的版本中,对响应式编程的支持得到了加强,增加了与Spring Cloud等微服务框架更好的集成特性。
二、核心概念
-
启动类(主类)
- 每个Spring Boot应用都有一个主类,这个主类通常使用
@SpringBootApplication
注解。这个注解是一个组合注解,它包含了@Configuration
(表示这是一个配置类)、@EnableAutoConfiguration
(开启自动配置)和@ComponentScan
(扫描组件)。例如:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
- 在这里,
SpringApplication.run
方法用于启动Spring Boot应用,它会加载配置,扫描组件,并启动嵌入式服务器(如果是Web应用)等操作。
- 每个Spring Boot应用都有一个主类,这个主类通常使用
-
自动配置
- Spring Boot的自动配置是基于条件注解(如
@ConditionalOnClass
、@ConditionalOnMissingBean
等)实现的。这些条件注解会根据类路径中的类是否存在、Bean是否已经存在等条件来决定是否进行配置。例如,当javax.servlet.Servlet
类存在于类路径中(意味着这是一个Web应用),并且没有自定义的ServletWebServerFactory
Bean,Spring Boot会自动配置一个嵌入式的Tomcat服务器。 - 开发人员也可以通过在
application.properties
或application.yml
文件中设置属性来覆盖自动配置的某些部分。比如,你可以通过server.port = 8081
来改变应用运行的端口号。
- Spring Boot的自动配置是基于条件注解(如
-
依赖管理
- Spring Boot通过在
pom.xml
(如果使用Maven)或build.gradle
(如果使用Gradle)文件中管理依赖。它有自己的“starter”依赖,这些starter依赖会自动引入一组相关的库,使得添加功能变得非常方便。例如,spring - boot - starter - web
会引入Spring MVC、嵌入式Tomcat等相关的库,用于开发Web应用。 - 版本管理也比较方便,Spring Boot会管理它所依赖的各种库的版本,避免了版本冲突的问题。通常,你只需要关注Spring Boot本身的版本升级,它会确保引入的依赖库的版本兼容性。
- Spring Boot通过在
三、配置文件
-
application.properties和application.yml
- 格式区别:
application.properties
是一种键值对的格式,例如server.port=8080
。而application.yml
是YAML格式,它的结构更加清晰,例如:
server: port: 8080
- 功能相同点:它们都用于配置Spring Boot应用的各种属性,包括服务器端口、数据库连接、日志级别等。这些配置属性可以覆盖Spring Boot的自动配置。
- 加载顺序:如果同时存在
application.properties
和application.yml
,application.properties
会先被加载,然后application.yml
中的配置会覆盖相同属性的application.properties
中的配置。
- 格式区别:
-
配置文件的层次性
- Spring Boot支持多环境配置。可以通过
application - {profile}.properties
或application - {profile}.yml
的形式来配置不同环境(如dev
、test
、prod
)下的属性。例如,application - dev.properties
用于开发环境配置,application - prod.properties
用于生产环境配置。 - 在运行应用时,可以通过
--spring.profiles.active=prod
这样的命令行参数来指定使用哪个环境的配置文件。
- Spring Boot支持多环境配置。可以通过
-
自定义配置属性类
- 可以通过
@ConfigurationProperties
注解来创建一个自定义的配置属性类。例如,如果你有一个配置属性用于存储数据库连接相关的信息,你可以这样定义:
import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "myapp.database") public class DatabaseConfig { private String url; private String username; private String password; // 省略getter和setter方法 }
- 然后在
application.properties
或application.yml
中可以这样配置:
myapp: database: url: jdbc:mysql://localhost:3306/mydb username: root password: 123456
- 并且要在主类或者一个配置类中通过
@EnableConfigurationProperties
注解来启用这个自定义配置属性类,这样Spring Boot就可以将配置文件中的属性绑定到这个类的属性上。
- 可以通过
四、Web开发
-
MVC架构支持
- Spring Boot对Spring MVC提供了很好的支持。可以通过创建
@RestController
或@Controller
注解的类来处理HTTP请求。例如:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/hello") public String sayHello() { return "Hello, World!"; } }
- 这里
@RestController
是一个组合注解,它包含了@Controller
和@ResponseBody
,表示这个类中的方法返回的结果会直接作为HTTP响应的内容(如JSON格式的数据)。@GetMapping
注解用于映射HTTP GET请求到sayHello
方法。
- Spring Boot对Spring MVC提供了很好的支持。可以通过创建
-
模板引擎集成
- Spring Boot可以很方便地集成各种模板引擎,如Thymeleaf、Freemarker等。以Thymeleaf为例,首先要在
pom.xml
中添加spring - boot - starter - thymeleaf
依赖。然后可以在resources/templates
目录下创建HTML模板文件。例如,一个简单的Thymeleaf模板文件index.html
:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>My Page</title> </head> <body> <p th:text="${message}"></p> </body> </html>
- 可以在控制器中返回这个模板视图,并传递数据给它,如:
import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class ThymeleafController { @GetMapping("/thymeleaf") public String thymeleafPage(Model model) { model.addAttribute("message", "This is a Thymeleaf page."); return "index"; } }
- Spring Boot可以很方便地集成各种模板引擎,如Thymeleaf、Freemarker等。以Thymeleaf为例,首先要在
-
文件上传和下载支持
- 在Spring Boot中实现文件上传,可以在控制器方法中使用
MultipartFile
参数。例如:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController public class FileUploadController { @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { try { // 处理文件保存等操作 return "File uploaded successfully."; } catch (Exception e) { return "File upload failed: " + e.getMessage(); } } else { return "Please select a file to upload."; } } }
- 对于文件下载,可以通过设置
Content - Disposition
头和返回文件流的方式来实现。
- 在Spring Boot中实现文件上传,可以在控制器方法中使用
五、数据访问
- 关系型数据库访问(以JPA为例)
- 首先要在
pom.xml
中添加spring - boot - starter - data - jpa
和相应的数据库驱动依赖(如mysql - connector - java
)。然后可以通过定义实体类、Repository接口来进行数据库操作。例如,定义一个简单的实体类:
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; // 省略getter和setter方法 }
- 再定义一个Repository接口来操作这个实体类:
import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { }
- 可以在服务层或者控制器中注入
UserRepository
并使用它的方法(如save
、findById
、findAll
等)来进行数据库操作。
- 首先要在
- 非关系型数据库访问(以Redis为例)
- 要添加
spring - boot - starter - data - redis
依赖。然后可以通过RedisTemplate
来操作Redis。例如,在配置类中配置RedisTemplate
:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } }
- 之后可以在其他类中注入
RedisTemplate
并使用它来进行Redis操作,如set
、get
等操作。
- 要添加
六、安全
-
Spring Security集成
- 添加
spring - boot - starter - security
依赖后,Spring Boot会自动配置基本的安全功能。默认情况下,会开启基于表单的认证,并且会生成一个随机的密码在控制台输出。 - 可以通过自定义
SecurityConfig
类来配置安全规则。例如:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin(); } }
- 这里配置了对
/public/
路径下的请求允许匿名访问,其他请求需要认证,并且使用表单登录的方式。
- 添加
-
安全相关的配置属性
- 在
application.properties
或application.yml
中可以配置许多安全相关的属性。例如,可以配置密码加密方式、会话管理等属性。security.user.name = admin
和security.user.password = password
可以用来设置默认的用户名和密码。
- 在
七、测试
- 单元测试
- Spring Boot提供了很好的单元测试支持。可以使用
@SpringBootTest
注解来加载整个Spring Boot应用上下文进行测试。例如:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest public class MyServiceTest { @Autowired private MyService myService; @Test public void testMyServiceMethod() { String result = myService.myMethod(); assertEquals("Expected Result", result); } }
- 这里
@Autowired
注入了要测试的服务类MyService
,然后在测试方法中调用服务类的方法并进行断言。
- Spring Boot提供了很好的单元测试支持。可以使用
- 集成测试
- 对于集成测试,除了
@SpringBootTest
,还可以使用@WebMvcTest
(用于测试Web层)等注解。例如,使用@WebMvcTest
来测试一个控制器:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest(HelloController.class) public class HelloControllerTest { @Autowired private MockMvc mockMvc; @Test public void testHelloController() throws Exception { mockMvc.request(get("/hello")) .andExpect(status().isOk()) .andExpect(content().string("Hello, World!")); } }
- 这里
@WebMvcTest
指定了要测试的控制器类HelloController
,MockMvc
用于模拟HTTP请求,然后通过andExpect
方法来检查响应的状态码和内容。
- 对于集成测试,除了
八、监控与管理
- Actuator
- Spring Boot Actuator是一个用于监控和管理Spring Boot应用的模块。添加
spring - boot - starter - actuator
依赖后,可以访问许多端点来获取应用的运行信息。例如,/health
端点可以查看应用的健康状态,/metrics
端点可以获取应用的各种指标(如内存使用情况、请求响应时间等)。 - 这些端点可以通过HTTP请求访问,默认情况下,部分端点是安全的,需要认证才能访问。可以通过配置来改变端点的安全性和暴露的端点。
- Spring Boot Actuator是一个用于监控和管理Spring Boot应用的模块。添加
- 自定义监控指标
- 可以通过实现
CounterService
、GaugeService
等接口或者使用Micrometer等工具来定义自己的监控指标。例如,使用Micrometer来记录一个方法的执行时间:
import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Timer; import org.springframework.stereotype.Component; @Component public class MyMetricService { private final Timer timer; public MyMetricService(MeterRegistry meterRegistry) { this.timer = Timer.builder("my.method.timer") .description("Timer for my method") .register(meterRegistry); } public void myMethod() { try (Timer.Sample sample = Timer.start()) { // 执行方法逻辑 } finally { sample.stop(timer); } } }
- 这样就可以通过Actuator的
/metrics
端点来查看my.method.timer
这个指标的相关数据。
- 可以通过实现