Spring Boot框架学习入门涵盖了Spring Boot的基本概念、优势和核心概念,介绍了从开发环境搭建到创建第一个应用的全过程,包括配置文件的使用和外部化配置的引入。文章详细讲解了Spring Boot的核心注解和数据访问与存储的实现方法。
Spring Boot简介Spring Boot是由Pivotal团队提供的基于Spring平台的全新框架,旨在简化Spring应用的开发过程,使开发人员能够快速、便捷地创建独立、生产级别的基于Spring的应用程序。Spring Boot提供了一种无需配置大量XML文件即可快速创建Spring应用的方法。它通过约定优于配置的原则,极大地减少了配置的复杂性,使开发者可以专注于业务逻辑的实现。
Spring Boot的核心概念包括自动配置、配置文件、起步依赖、starter等。
@EnableAutoConfiguration
注解实现了自动配置功能。它会根据类路径下的依赖,自动配置项目中的各种配置,减少了手动配置的工作量。application.properties
和application.yml
。这些文件用于配置各种属性,例如端口号、数据库连接、日志配置等。pom.xml
或build.gradle
文件中声明一个或多个起步依赖,Spring Boot就会自动导入相关的依赖和配置。spring-boot-starter
为前缀,例如spring-boot-starter-web
用于创建Web应用,spring-boot-starter-data-jpa
用于数据库操作等。在开始开发Spring Boot应用之前,首先需要安装Java开发工具包(JDK)。以下是安装JDK的步骤:
JAVA_HOME
和PATH
变量。在Linux或Mac系统中,可以通过编辑~/.bashrc
或~/.zshrc
文件来设置环境变量。示例代码(设置环境变量):
# Windows setx JAVA_HOME "C:\Program Files\Java\jdk-17.0.1" setx PATH "%JAVA_HOME%\bin;%PATH%" # Linux/Mac export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
推荐使用IntelliJ IDEA作为开发工具,以下是安装步骤:
示例代码(设置环境变量):
# Windows setx JAVA_HOME "C:\Program Files\Java\jdk-17.0.1" setx PATH "%JAVA_HOME%\bin;%PATH%" # Linux/Mac export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
创建Spring Boot项目有多种方式,可以通过Spring Initializr或IDE进行创建。以下是使用Spring Initializr创建项目的步骤:
创建Spring Boot项目的方法已经在上一部分介绍过了,可以参考创建Spring Boot项目的步骤。
编写第一个Spring Boot应用需要创建一个简单的控制器类,用于处理HTTP请求。
HelloController
。示例代码(HelloController.java):
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, Spring Boot!"; } }
Ctrl+R
来运行应用。http://localhost:8080/hello
,查看应用是否正常运行。示例代码(运行应用):
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }Spring Boot常用注解介绍
@SpringBootApplication
是Spring Boot中的核心注解,用于启用自动配置和组件扫描。它相当于组合了@Configuration
、@EnableAutoConfiguration
和@ComponentScan
三个注解。
@Bean
注解的方法。示例代码(使用@SpringBootApplication):
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
这些注解主要用于分层应用的设计,帮助开发者明确各个组件的职责。
示例代码(使用@Controller、@Service、@Repository、@Component):
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Service; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @Controller public class UserController { @GetMapping("/users") public String getUsers() { return "Users List"; } } @Service public class UserService { public String getUserDetails() { return "User Details"; } } @Repository public class UserRepository { public String getUserFromDatabase() { return "User from Database"; } } @Component public class UtilityComponent { public String getUtilityMessage() { return "Utility Message"; } }
@RestController
注解用于标记控制器类,表示该类中的所有方法都将返回纯数据对象,而不是视图对象。@RequestMapping
注解用于映射HTTP请求到控制器方法。
@Controller
和@ResponseBody
注解,用于处理RESTful风格的请求。示例代码(使用@RestController和@RequestMapping):
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/hello") public String sayHello() { return "Hello, Spring Boot!"; } }数据访问与存储
Spring Data JPA是Spring Data的一部分,提供了一套简化数据访问的API,支持多种ORM(Object-Relational Mapping)框架,例如JPA(Java Persistence API)。
pom.xml
或build.gradle
文件中添加Spring Data JPA的起步依赖。application.properties
或application.yml
文件中配置数据源信息。@Entity
注解定义实体类,可以使用@Id
注解来标记主键字段。@Repository
注解定义仓库接口,继承JpaRepository
接口。示例代码(使用Spring Data JPA):
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.JpaRepository; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; // getters and setters } @Repository public interface UserRepository extends JpaRepository<User, Long> { }
application.properties
或application.yml
文件中配置数据库连接信息。示例代码(配置数据源):
# application.properties spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=root spring.jpa.hibernate.ddl-auto=update
示例代码(编写CRUD操作):
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserRepository userRepository; public User createUser(User user) { return userRepository.save(user); } public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } public List<User> getAllUsers() { return userRepository.findAll(); } 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); } }
Spring Boot内置了对事务管理的支持,可以通过@Transactional
注解来控制事务的提交与回滚。
@Transactional
注解。示例代码(使用事务管理):
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void createUserAndLog(User user) { userRepository.save(user); // 模拟一个可能导致异常的操作 int result = 1 / 0; } @Transactional public void updateUserAndLog(Long id, User user) { User existingUser = userRepository.findById(id).orElse(null); if (existingUser != null) { existingUser.setName(user.getName()); existingUser.setEmail(user.getEmail()); userRepository.save(existingUser); // 模拟一个可能导致异常的操作 int result = 1 / 0; } } }配置文件和外部化配置
Spring Boot支持多种配置文件格式,例如application.properties
和application.yml
。这些文件用于配置各种属性,例如端口号、数据库连接、日志配置等。
src/main/resources
目录下。application.properties
和application.yml
支持键值对的形式进行配置。示例代码(application.properties):
# application.properties server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=root spring.jpa.hibernate.ddl-auto=update
示例代码(application.yml):
# application.yml server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: root jpa: hibernate: ddl-auto: update
Spring Boot支持将配置文件外部化,可以通过环境变量、命令行参数、外部配置文件等方式引入配置。
--spring.config.location
参数指定外部配置文件的位置。示例代码(环境变量):
# 使用环境变量覆盖配置 export SPRING_DATASOURCE_URL=jdbc:mysql://external-host:3306/mydb
示例代码(命令行参数):
# 使用命令行参数传递配置 java -jar myapp.jar --server.port=8081
示例代码(外部配置文件):
# 指定外部配置文件的位置 java -jar myapp.jar --spring.config.location=/path/to/external/config/application.properties
Spring Boot支持使用环境变量来配置属性,可以通过${}
语法引用环境变量。
${}
语法引用环境变量。示例代码(引用环境变量):
# application.properties server.port=${PORT:8080} spring.datasource.url=${DB_URL:jdbc:mysql://localhost:3306/mydb}
示例代码(环境变量定义):
# 定义环境变量 export PORT=8081 export DB_URL=jdbc:mysql://external-host:3306/mydb