Spring Boot 是一个简化 Spring 应用程序开发、配置和部署的框架,通过自动配置功能和约定优于配置的原则,大大减少了开发者的配置工作。本文将详细介绍 Spring Boot 项目开发的学习路径,包括环境搭建、项目创建、基础功能开发以及高级特性的探索。Spring Boot 项目开发学习涵盖了从入门到实战的全过程,帮助开发者快速构建独立的生产级应用。
SpringBoot简介什么是SpringBoot
Spring Boot 是一个基于 Spring 框架的开源项目,它旨在简化 Spring 应用程序的开发、配置和部署。Spring Boot 通过自动配置功能,减少了开发者编写配置代码的复杂度,使开发者能够快速构建独立的、生产级别的应用。
Spring Boot 通过约定优于配置的原则,减少了项目的配置文件数量,简化了项目的搭建过程。它提供了一套默认配置,开发者只需专注于业务逻辑的开发,而无需过多关注底层的配置细节。
SpringBoot的优点
-
快速应用开发
- Spring Boot 通过提供大量的默认配置,使得开发者能够快速搭建应用,无需编写大量的配置代码。
- 它内置了众多常用库和框架的自动配置,如 Spring MVC、Spring Data JPA、Spring Security 等,大幅提高了开发效率。
-
独立运行
- Spring Boot 应用程序可以独立运行,无需额外的中间件支持。它内置了一个嵌入式的 Tomcat、Jetty 或者 Undertow 服务器,使得开发和测试变得非常简单。
- 只需将代码编译打包为一个可执行的 jar 或 war 文件,就可以直接运行,无需安装额外的服务器。
-
配置简单
- Spring Boot 提供了一套默认配置,并允许开发者通过外部化配置来覆盖默认配置。
- 开发者可以使用
application.properties
或application.yml
文件来配置应用的各种属性,简化了配置过程。
- 嵌入式服务器
- Spring Boot 可以使用嵌入式服务器,如 Tomcat、Jetty 或 Undertow,这样使得应用可以作为一个独立的可执行 jar 文件运行。
- 开发者可以使用
mvn spring-boot:run
命令直接运行应用,无需额外的服务器安装步骤。
5.. 自动配置
- Spring Boot 通过自动配置功能,减少了开发者编写配置代码的复杂度。
- 它根据项目依赖自动配置 Spring Bean,简化了配置过程。
SpringBoot的核心概念
-
自动配置
- Spring Boot 通过自动配置功能,减少了开发者编写配置代码的工作量。
- 它会根据添加的依赖库自动配置 Spring Bean,简化了配置过程。例如,添加了 Spring Data JPA 依赖,Spring Boot 会自动配置数据源、实体管理器等。
-
外部化配置
- Spring Boot 提供了外部化配置功能,允许开发者通过
application.properties
或application.yml
文件来配置应用的各种属性。 - 开发者可以将配置文件放置在类路径下或外部目录中,以覆盖默认配置。
- Spring Boot 提供了外部化配置功能,允许开发者通过
-
starter 依赖
- Spring Boot 提供了大量 starter 依赖,如
spring-boot-starter-web
、spring-boot-starter-data-jpa
等,这些 starter 依赖包含了开发过程中常用的库和配置。 - 开发者只需要添加对应的 starter 依赖,就可以快速构建一个功能完备的应用程序。
- Spring Boot 提供了大量 starter 依赖,如
- Actuator
- Spring Boot Actuator 是一个用于监控和管理应用的模块,它提供了许多内置的端点,如
health
、info
、metrics
等。 - 开发者可以通过这些端点获取应用的运行时信息,以便进行监控和调试。
- Spring Boot Actuator 是一个用于监控和管理应用的模块,它提供了许多内置的端点,如
开发环境的搭建
开发 Spring Boot 应用程序首先需要搭建好开发环境。以下是搭建环境的基本步骤:
-
安装 JDK
- Spring Boot 应用程序需要 Java 环境,建议使用 JDK 8 及以上版本。
- 可以从 Oracle 官方网站下载安装包,或者使用 JDK 的第三方发行版,如 AdoptOpenJDK。
-
安装 IDE
- 推荐使用 IntelliJ IDEA 或 Eclipse,这两个 IDE 都支持 Spring Boot 开发。
- 安装 IDE 后,需要安装相应的插件来支持 Spring Boot 开发。例如,IntelliJ IDEA 提供了 Spring Boot 插件,可以方便地创建 Spring Boot 项目。
- 安装 Maven 或 Gradle
- Spring Boot 使用 Maven 或 Gradle 作为构建工具。
- Maven 是一个非常流行的 Java 构建工具,可以方便地管理项目依赖和构建过程。
- Gradle 是一个更现代的构建工具,它提供了更简洁的配置方式和更强大的功能。
创建第一个SpringBoot项目
创建一个 Spring Boot 项目可以使用 Spring Initializr(也可以称作 Spring Boot Initializr)来快速生成基本的项目结构和配置文件。以下是使用 Spring Initializr 创建项目的步骤:
-
访问 Spring Initializr 网站
- 访问 Spring Initializr 网站: https://start.spring.io/
- 选择项目的基本信息,如语言(Java)、依赖管理(Maven 或 Gradle)、Java 版本等。
-
添加依赖
- 在“Dependencies”(依赖)部分,添加所需的依赖。
- 例如,要创建一个 Web 应用,可以选择
Spring Web
依赖。 - 如果需要数据库支持,可以选择
Spring Data JPA
和Spring Data JDBC
等依赖。
- 生成项目
- 完成配置后,点击 “Generate”(生成)按钮,下载生成的项目压缩包。
- 解压压缩包,将项目导入到 IDE 中进行开发。
以下是使用 Maven 创建一个简单的 Spring Boot 项目并运行的示例代码:
<!-- pom.xml -->
<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.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
// DemoApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
项目结构介绍
一个典型的 Spring Boot 项目结构如下:
src/main/java
:存放 Java 源代码。src/main/resources
:存放资源文件,如配置文件application.properties
或application.yml
。src/main/resources/static
:存放静态资源文件,如 HTML、CSS、JavaScript 文件。src/main/resources/templates
:存放 Thymeleaf 模板文件。src/main/resources/META-INF/resources
:存放静态资源文件,如 HTML、CSS、JavaScript 文件。src/main/resources/META-INF/spring.factories
:存放 Spring Boot 自动配置文件。pom.xml
或build.gradle
:项目的构建配置文件。README.md
:项目说明文件。
src/main/java
目录下通常会有一个 DemoApplication.java
文件,它是项目的主入口点。src/main/resources
目录下通常会有一个 application.properties
或 application.yml
文件,用于配置应用的各种属性。
控制器与路由配置
Spring Boot 通过 @Controller
或 @RestController
注解来定义控制器类。控制器类中的方法可以通过 @RequestMapping
或 @GetMapping
、@PostMapping
等注解来定义路由。
以下是一个简单的控制器类示例:
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
在这个示例中,HelloController
类通过 @RestController
注解被标记为控制器类。hello
方法通过 @GetMapping
注解映射到 /hello
路径,当用户访问 /hello
路径时,服务会返回 "Hello, World!"
字符串。
模板引擎使用
Spring Boot 支持多种模板引擎,如 Thymeleaf、FreeMarker、Mustache 等。下面以 Thymeleaf 和 FreeMarker 为例,介绍如何使用模板引擎。
- 添加依赖
在 pom.xml
文件中添加 Thymeleaf 和 FreeMarker 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 定义控制器
定义一个控制器来渲染模板:
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class GreetingController {
@GetMapping("/greeting")
public String greeting(Model model) {
model.addAttribute("message", "Hello, Thymeleaf!");
return "greeting";
}
@GetMapping("/freemarker")
public String freemarker(Model model) {
model.addAttribute("message", "Hello, FreeMarker!");
return "freemarker";
}
}
在这个示例中,GreetingController
类通过 @Controller
注解被标记为控制器类。greeting
方法通过 @GetMapping
注解映射到 /greeting
路径,当用户访问 /greeting
路径时,服务会渲染 greeting.html
模板并返回结果。freemarker
方法则渲染 freemarker.ftl
模板。
- 创建模板文件
在 src/main/resources/templates
目录下创建一个名为 greeting.html
的 Thymeleaf 模板文件,和一个名为 freemarker.ftl
的 FreeMarker 模板文件:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Greeting</title>
</head>
<body>
<h1 th:text="${message}"></h1>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>FreeMarker Greeting</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
在这个示例中,greeting.html
模板文件中使用了 Thymeleaf 的 th:text
标签来插入 message
变量的值。freemarker.ftl
文件则直接使用 FreeMarker 的语法来插入变量。
数据库连接与操作
Spring Boot 支持多种数据库,如 MySQL、PostgreSQL、SQLite 等。下面以 MySQL 为例,介绍如何连接数据库并执行 CRUD 操作。
- 添加依赖
在 pom.xml
文件中添加 MySQL 依赖:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
- 配置数据源
在 application.properties
文件中配置数据源连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 定义实体类
定义一个实体类来表示数据库表结构:
package com.example.demo;
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;
// Getters and setters
}
- 定义仓库接口
定义一个仓库接口来执行 CRUD 操作:
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
- 定义服务类
定义一个服务类来封装业务逻辑:
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getAllUsers() {
return userRepository.findAll();
}
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
public User createUser(User user) {
return userRepository.save(user);
}
public User updateUser(Long id, User user) {
User existingUser = userRepository.findById(id).orElse(null);
if (existingUser != null) {
existingUser.setName(user.getName());
existingUser.setEmail(user.getEmail());
return userRepository.save(existingUser);
}
return null;
}
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
在这个示例中,UserService
类通过 @Service
注解被标记为服务类。getAllUsers
方法返回所有用户列表,getUserById
方法根据用户ID获取单个用户,createUser
方法创建新用户,updateUser
方法更新用户信息,deleteUser
方法删除用户。
- 定义控制器
定义一个控制器来处理 HTTP 请求:
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {
return userService.updateUser(id, user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
}
在这个示例中,UserController
类通过 @RestController
注解被标记为控制器类。getUsers
方法返回所有用户列表,getUser
方法根据用户ID获取单个用户,createUser
方法创建新用户,updateUser
方法更新用户信息,deleteUser
方法删除用户。
配置文件管理
Spring Boot 支持多种配置文件,如 application.properties
、application.yml
等。这些配置文件可以放置在不同的位置,如类路径下、外部目录中等。Spring Boot 会根据配置文件的优先级顺序来加载配置。
- 配置文件优先级
配置文件的优先级顺序如下:
command line arguments
:命令行参数os environment variables
:环境变量java:comp/env
:Java 环境变量random values
:随机值jar packaged external config file
:打包后的外部配置文件external config file
:外部配置文件git configuration file
:Git 配置文件default values
:默认值
- 使用配置文件
例如,在 application.properties
文件中可以配置应用的各种属性:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
自动配置原理
Spring Boot 的自动配置原理是通过 @Configuration
类来定义配置 Bean,并通过 @Conditional
注解来限制配置 Bean 的创建条件。
- 自动配置类
Spring Boot 提供了大量的自动配置类,如 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
、org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
等。
- 自动配置过程
自动配置过程主要包含以下几个步骤:
@Configuration
类通过@EnableAutoConfiguration
注解来启用自动配置。@Conditional
注解用于限制配置 Bean 的创建条件,如@ConditionalOnClass
、@ConditionalOnMissingBean
等。@Bean
方法用于定义配置 Bean。
例如,DataSourceAutoConfiguration
类通过 @ConditionalOnClass
注解来限制数据源自动配置的条件:
@ConditionalOnClass(name = "org.apache.tomcat.jdbc.pool.DataSource")
public class DataSourceAutoConfiguration {
// ...
}
Actuator监控支持
Spring Boot Actuator 是一个用于监控和管理应用的模块,它提供了许多内置的端点,如 health
、info
、metrics
等。
- 启用Actuator
在 pom.xml
文件中添加 Actuator 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 配置Actuator
在 application.properties
文件中配置 Actuator 端点:
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
- 访问Actuator端点
启动应用后,可以通过访问 http://localhost:8080/actuator
来查看所有 Actuator 端点。
例如,访问 http://localhost:8080/actuator/health
可以查看应用的健康状态:
{
"status": "UP",
"details": {
"db": {
"database": "MySQL",
"dbTime": "2020-05-01T20:30:40.607+00:00"
}
}
}
实战案例解析
用户认证与权限管理
Spring Boot 结合 Spring Security 可以轻松实现用户认证与权限管理功能。
- 添加依赖
在 pom.xml
文件中添加 Spring Security 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 配置安全规则
在 application.properties
文件中配置安全规则:
spring.security.user.name=admin
spring.security.user.password=password
spring.security.user.roles=ADMIN
- 定义安全配置类
定义一个安全配置类来配置安全规则:
package com.example.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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 {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password(passwordEncoder().encode("password"))
.roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.antMatchers("/").permitAll()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
在这个示例中,SecurityConfig
类通过 @EnableWebSecurity
注解被标记为安全配置类。configure
方法配置了用户认证和权限管理规则,configure
方法配置了安全规则。
- 定义控制器
定义一个控制器来处理登录请求:
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
}
- 创建登录页面
在 src/main/resources/templates
目录下创建一个名为 login.html
的登录页面:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Login Page</title>
</head>
<body>
<h1>Login</h1>
<form th:action="@{/login}" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required><br>
<button type="submit">Login</button>
</form>
</body>
</html>
- 定义全局异常处理器
定义一个全局异常处理器来处理异常:
package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
在这个示例中,LoginController
类通过 @Controller
注解被标记为控制器类。login
方法返回登录页面。GlobalExceptionHandler
类通过 @ControllerAdvice
注解被标记为全局异常处理器,处理所有类型的异常并返回 HTTP 500 状态码和异常信息。
RESTful API设计与实现
Spring Boot 结合 Spring MVC 可以轻松实现 RESTful API。
- 定义控制器
定义一个控制器来处理 HTTP 请求:
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/hello")
public String hello() {
return "Hello, API!";
}
}
在这个示例中,ApiController
类通过 @RestController
注解被标记为控制器类。hello
方法通过 @GetMapping
注解映射到 /api/hello
路径,当用户访问 /api/hello
路径时,服务会返回 "Hello, API!"
字符串。
- 定义资源
定义一个资源类来表示 RESTful API 的资源:
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping
public List<User> getUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {
return userService.updateUser(id, user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
}
在这个示例中,UserController
类通过 @RestController
注解被标记为控制器类。getUsers
方法返回所有用户列表,getUser
方法根据用户ID获取单个用户,createUser
方法创建新用户,updateUser
方法更新用户信息,deleteUser
方法删除用户。
日志与异常处理
Spring Boot 支持多种日志框架,如 Log4j、Logback、JUL 等。Spring Boot 默认使用 Logback 作为日志框架。
- 配置日志
在 application.properties
文件中配置日志级别:
logging.level.root=INFO
logging.level.com.example.demo=DEBUG
- 定义异常处理器
定义一个异常处理器来处理异常:
package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
在这个示例中,GlobalExceptionHandler
类通过 @ControllerAdvice
注解被标记为全局异常处理器。handleException
方法处理所有类型的异常,并返回 HTTP 500 状态码和异常信息。
SpringBoot项目部署
Spring Boot 应用程序可以作为独立的可执行 jar 文件运行。以下是部署 Spring Boot 应用程序的步骤:
- 打包项目
使用 Maven 或 Gradle 将项目打包为 jar 文件:
mvn package
或
gradle build
- 运行 jar 文件
使用 java -jar
命令运行 jar 文件:
java -jar target/demo-0.0.1-SNAPSHOT.jar
- 部署到云平台
可以将 Spring Boot 应用程序部署到云平台,如 AWS、Google Cloud、Azure 等。这些云平台提供了托管服务,如 Elastic Beanstalk、App Engine、App Service 等。
常见问题及解决方法
- 启动失败
如果启动失败,可以查看日志文件或控制台输出信息来定位问题。常见的问题包括依赖冲突、配置错误、资源不存在等。
- 性能问题
如果性能问题,可以使用 Spring Boot Actuator 来监控应用的运行时信息。例如,/actuator/metrics
端点可以查看应用的性能指标。
- 安全问题
如果安全问题,可以使用 Spring Security 来实现用户认证与权限管理功能。例如,@PreAuthorize
注解可以限制方法的访问权限。
进阶学习资源推荐
- 在线教程
- 慕课网
- Spring 官方文档
- Spring Boot 官方文档
- 开源项目
- Spring Boot 样例项目
- Spring Security 样例项目
- 社区
- Stack Overflow
- GitHub
学习 Spring Boot 不仅要掌握基础功能的开发,还需要了解高级特性的使用。推荐开发者积极参加社区活动,如参与开源项目、提交 Pull Request 等。