本文详细介绍了如何使用Spring Boot搭建单体架构应用,涵盖了环境搭建、常用功能实现、部署与优化等关键步骤。文章提供了丰富的代码示例和配置说明,帮助读者快速掌握Springboot单体架构搭建资料。
Spring Boot简介Spring Boot 是一个基于 Spring 框架的 Java 应用程序开发工具。它通过简化配置、自动化配置和减少样板代码,使开发者能够快速构建独立的、生产级别的应用。Spring Boot 旨在简化 Spring 应用的初始配置和依赖管理,使得开发者可以专注于业务逻辑的开发。
简易的项目配置:
嵌入式Web服务器:
mvn spring-boot:run
或 gradle bootRun
命令直接运行,无需额外配置应用服务器。自动配置:
起步依赖:
starters
概念,提供了许多常用的依赖库,如 spring-boot-starter-web
、spring-boot-starter-data-jpa
等,简化了依赖管理。外部化配置:
application.properties
或 application.yml
文件进行配置。此外,还可以通过环境变量、命令行参数等方式进行配置。健康检查和监控:
/actuator/health
,可以通过这些端点检查应用的健康状况。/actuator/info
、/actuator/metrics
等端点,方便开发者监控应用的运行状态。配置简化:
@Configuration
类来配置应用。依赖管理:
pom.xml
或 build.gradle
文件中添加所需的依赖。spring-boot-starter
依赖集,简化了依赖管理,只需添加一个依赖即可引入一系列常用的库。自动配置:
@Configuration
注解手动配置 Bean。@EnableAutoConfiguration
注解,自动配置了许多常用的场景。运行环境:
mvn spring-boot:run
或 gradle bootRun
命令直接运行。单体架构是一种将整个应用作为一个单一的可执行单元的架构方式。在这种架构中,所有的功能模块都部署在同一个进程中,共享同一个进程空间。单体架构通常将应用部署为一个 WAR 文件或 JAR 文件,易于构建、部署和测试。
在单体架构和微服务架构的对比中,单体架构的优点主要体现在其简单性和快速部署,而缺点则在于其扩展性和维护性较差。相比之下,微服务架构通过将应用拆分成多个独立的服务,能够更好地支持应用的扩展和维护,但同时也带来了部署复杂性和开发难度增加的问题。
Spring Boot环境搭建确保已经安装了 Java 开发工具包(JDK)。推荐使用 Java 8 或更高版本。
使用 Spring Initializr 创建项目:
Project
为 Maven 项目,Language
为 Java,Spring Boot
版本,选择所需依赖(如 Web、JPA 等)。在 pom.xml
文件中添加所需的依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> </dependencies>
在 build.gradle
文件中添加所需的依赖:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.h2database:h2' }
application.properties
配置spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= spring.h2.console.enabled=true spring.jpa.hibernate.ddl-auto=update
application.yml
配置spring: datasource: url: jdbc:h2:mem:testdb driverClassName: org.h2.Driver username: sa password: h2: console: enabled: true jpa: hibernate: ddl-auto: updateSpring Boot常用功能实现
创建一个简单的 RESTful API,用于查询用户信息。
package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.ArrayList; @RestController @RequestMapping("/users") public class UserController { private List<User> users = new ArrayList<>(); public UserController() { users.add(new User(1, "Alice", "alice@example.com")); users.add(new User(2, "Bob", "bob@example.com")); } @GetMapping("/") public List<User> getUsers() { return users; } }
package com.example.demo.model; public class User { private int id; private String name; private String email; public User(int id, String name, String email) { this.id = id; this.name = name; this.email = email; } public int getId() { return id; } public String getName() { return name; } public String getEmail() { return email; } }
启动应用后,访问 http://localhost:8080/users/
,会看到返回的用户列表。
package com.example.demo.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class UserEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; // Getters and Setters }
package com.example.demo.repository; import com.example.demo.entity.UserEntity; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<UserEntity, Long> { }
package com.example.demo.service; import com.example.demo.entity.UserEntity; import com.example.demo.repository.UserRepository; 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<UserEntity> getAllUsers() { return (List<UserEntity>) userRepository.findAll(); } }
package com.example.demo.controller; import com.example.demo.service.UserService; import com.example.demo.entity.UserEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("/users") public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @GetMapping("/") public List<UserEntity> getUsers() { return userService.getAllUsers(); } }
默认情况下,Spring Boot 使用 Logback 作为日志框架。
application.properties
配置logging.level.root=INFO logging.level.com.example.demo=DEBUG
package com.example.demo.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class LoggingExample implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class); @Override public void run(String... args) throws Exception { logger.debug("Debug log"); logger.info("Info log"); logger.warn("Warn log"); logger.error("Error log"); } }
package com.example.demo.exception; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) @ResponseBody public ResponseEntity<String> handleException(Exception e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } }
package com.example.demo.controller; import com.example.demo.exception.UserNotFoundException; import com.example.demo.service.UserService; import com.example.demo.entity.UserEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("/users") public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @GetMapping("/") public List<UserEntity> getUsers() throws UserNotFoundException { List<UserEntity> users = userService.getAllUsers(); if (users.isEmpty()) { throw new UserNotFoundException("No users found"); } return users; } }单体架构下的Spring Boot应用部署
mvn clean package
将打包好的 JAR 文件上传到远程服务器,例如使用 SCP 命令:
scp target/project.jar user@remote-server:/path/to/deploy/
java -jar project.jar
在 IDE 中启动应用时,可以通过断点调试来调试代码。
Spring Boot Actuator 提供了一系列端点来监控和管理应用。
在 pom.xml
或 build.gradle
中添加 spring-boot-starter-actuator
依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
implementation 'org.springframework.boot:spring-boot-starter-actuator'
启动应用后,访问 http://localhost:8080/actuator
,可以看到一系列端点,如 /health
、/info
、/metrics
等。
依赖管理:
spring-boot-starter
来简化依赖管理。pom.xml
或 build.gradle
文件中明确声明依赖版本。配置分离:
application.properties
或 application.yml
)。单元测试:
package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.ArrayList; @RestController @RequestMapping("/users") public class UserController { private List<User> users = new ArrayList<>(); public UserController() { users.add(new User(1, "Alice", "alice@example.com")); users.add(new User(2, "Bob", "bob@example.com")); } @GetMapping("/") public List<User> getUsers() { return users; } }
查询优化:
@Query
注解来优化 SQL 查询。升级步骤:
pom.xml
或 build.gradle
文件中的 Spring Boot 版本。处理兼容性问题:
<!-- 修改 Spring Boot 版本 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.4</version> </parent>
// 修改 Spring Boot 版本 implementation 'org.springframework.boot:spring-boot-starter-web:2.5.4'