Spring Boot项目开发学习入门介绍了Spring Boot框架的基本概念、环境搭建、第一个Hello World项目、核心概念如自动配置和依赖注入,以及常见功能开发和项目部署。文章不仅涵盖了RESTful服务开发和数据库操作,还详细讲解了静态资源与模板引擎的使用。此外,还包括项目打包与部署的指南,以及日志与监控的相关配置和使用技巧。
Spring Boot 是一个由 Spring 团队开发的项目,其目标是简化 Spring 应用程序的开发过程,通过提供一系列约定优于配置的功能,使得开发者能够快速创建独立的、生产级别的应用。Spring Boot 包含了自动配置、内置的服务器(Tomcat、Jetty、Undertow)、嵌入式数据库、开发工具支持(如 Spring Boot Devtools)、对各种第三方库的支持(如 Spring Data、Spring Security)等。
要开始开发 Spring Boot 应用,首先需要配置好开发环境。以下是常用的开发环境配置步骤:
pom.xml
文件中添加 Spring Boot 依赖,例如 spring-boot-starter-web
和 spring-boot-starter-data-jpa
:<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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.5</version> </parent> <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> </dependencies> </project>
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应用,展示 "Hello World"。
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"; } }
启动应用:运行 DemoApplication
类中的 main
方法,启动应用。
http://localhost:8080/hello
,应看到返回 "Hello World"。Spring Boot 的核心优势之一是自动配置。Spring Boot 通过 spring-boot-autoconfigure
模块中的 @SpringBootApplication
注解来自动配置应用。该注解组合了 @Configuration
、@EnableAutoConfiguration
和 @ComponentScan
三个注解。
依赖注入是 Spring 框架的核心特性之一,Spring Boot 继承了这一特性,通过 @Autowired
注解进行自动注入。
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } @RestController public class HelloController { private final GreetingService greetingService; public HelloController(GreetingService greetingService) { this.greetingService = greetingService; } @GetMapping("/hello") public String hello() { return greetingService.sayHello(); } } interface GreetingService { String sayHello(); } class SimpleGreetingService implements GreetingService { @Override public String sayHello() { return "Hello, World!"; } }
要在Spring Boot中自定义自动配置,可以创建一个带有 @Configuration
注解的类,并使用 @ConditionalOnProperty
来根据配置属性决定是否启用某些配置。
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Conditional; @Configuration @EnableConfigurationProperties(AppProperties.class) public class CustomConfig { @Bean @ConditionalOnProperty(name = "app.enabled", havingValue = "true") public MyBean myBean(AppProperties appProperties) { return new MyBean(appProperties.getName()); } } @ConfigurationProperties(prefix = "app") public class AppProperties { private String name; // getters and setters }
Spring Boot Starter 是一组依赖,包括一些常用的框架和库,如 Spring Boot Starter Web、Spring Boot Starter JPA 等。这些 Starter 已经预设了依赖版本,可以简化依赖管理。
例如,要创建一个包含 RESTful 服务的 Spring Boot 项目,可以添加 spring-boot-starter-web
依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Spring Boot 配置文件主要有 application.properties
和 application.yml
,用于定义应用的各种配置。
server.port
spring.application.name
spring.datasource.url
, spring.datasource.username
, spring.datasource.password
示例 application.properties
文件:
server.port=8080 spring.application.name=DemoApp spring.datasource.url=jdbc:mysql://localhost:3306/demo spring.datasource.username=root spring.datasource.password=root
logging.level.root
spring.datasource.hikari.maximum-pool-size
@ConfigurationProperties
注解logging.level.root=INFO spring.datasource.hikari.maximum-pool-size=10
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "app") public class AppProperties { private String name; // getters and setters }
RESTful 服务是现代 Web 应用的基石,Spring Boot 提供了简单的方式来开发 RESTful 服务。
package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.Arrays; import java.util.List; @RestController public class UserController { @GetMapping("/users") public List<User> getUsers() { return Arrays.asList( new User(1L, "John"), new User(2L, "Jane") ); } @PostMapping("/users") public User createUser(@RequestBody User user) { // 添加用户逻辑 return user; } } class User { private Long id; private String name; public User(Long id, String name) { this.id = id; this.name = name; } // getters and setters }
spring-boot-starter-web
@RestController
和 @GetMapping
/@PostMapping
注解Spring Boot 可以方便地集成关系型数据库,如 MySQL、PostgreSQL,以及非关系型数据库,如 MongoDB。
spring-boot-starter-data-jpa
示例配置:
spring.datasource.url=jdbc:mysql://localhost:3306/demo spring.datasource.username=root spring.datasource.password=root spring.jpa.hibernate.ddl-auto=update
示例代码:
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } @Entity class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // getters and setters } package com.example.demo; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.JpaRepository; @SpringBootApplication public class DemoApplication extends CommandLineRunner { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } interface UserRepository extends JpaRepository<User, Long> { } @Override public void run(String... args) throws Exception { UserRepository userRepository = new UserRepository(); userRepository.save(new User(1L, "John")); userRepository.save(new User(2L, "Jane")); } }
Spring Boot 支持使用模板引擎,如 Thymeleaf、Freemarker 等,来渲染 HTML 页面。
spring-boot-starter-thymeleaf
/src/main/resources/templates/users.html
)示例代码:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Users List</title> </head> <body> <h1>Users</h1> <ul> <li th:each="user : ${users}" th:text="${user.name}"></li> </ul> </body> </html>
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import java.util.Arrays; import java.util.List; @Controller public class UserController { @GetMapping("/users") public String getUsers(Model model) { List<User> users = Arrays.asList( new User(1L, "John"), new User(2L, "Jane") ); model.addAttribute("users", users); return "users"; } }
spring-boot-starter-freemarker
/src/main/resources/templates/users.ftl
)示例代码:
<!DOCTYPE html> <html> <head> <title>Users List</title> </head> <body> <h1>Users</h1> <ul> <#list users as user> <li>${user.name}</li> </#list> </ul> </body> </html>
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import java.util.Arrays; import java.util.List; @Controller public class UserController { @GetMapping("/users") public String getUsers(Model model) { List<User> users = Arrays.asList( new User(1L, "John"), new User(2L, "Jane") ); model.addAttribute("users", users); return "users"; } }
使用 Maven 打包 Spring Boot 应用,生成一个可执行的 JAR 文件。
pom.xml
文件中添加 Maven 插件 spring-boot-maven-plugin
。<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
运行打包命令:在命令行中执行 mvn clean package
。
java -jar target/your-app.jar
来运行生成的 JAR 文件。部署 Spring Boot 应用到服务器,可以使用任意支持 Java 的服务器,如 Tomcat、Jetty 或直接使用内置的 Tomcat。
java -jar your-app.jar
启动应用。Docker 是一种容器化技术,可以方便地部署和管理应用。
FROM openjdk:8-jdk-alpine VOLUME /tmp COPY target/your-app.jar your-app.jar ENV PORT=8080 CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "your-app.jar", "--server.port=$PORT"]
构建 Docker 镜像:运行 docker build -t your-app:latest .
。
docker run -p 8080:8080 -it your-app:latest
启动容器。Spring Boot 使用 Logback 作为默认的日志框架。可以通过 application.properties
或 application.yml
文件来配置日志。
logging.level.root=INFO logging.level.org.springframework=DEBUG logging.file.name=app.log
logging: level: root: INFO org.springframework: DEBUG file: name: app.log
可以在 src/main/resources/logback-spring.xml
文件中自定义 Logback 配置。
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="STDOUT" /> </root> </configuration>
Spring Boot 提供了内置的监控和健康检查功能,可以通过 Actuator
端点来访问。
pom.xml
文件中添加 spring-boot-starter-actuator
依赖。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
application.properties
文件中配置 Actuator 端点。management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always
http://localhost:8080/actuator
来查看监控和健康检查信息。要使用 Prometheus 进行监控,可以添加 micrometer-registry-prometheus
依赖,并配置 Prometheus 服务器抓取数据。
pom.xml
文件中添加 Prometheus 依赖。<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
application.properties
文件中配置 Prometheus 服务器的端点。management.metrics.export.prometheus.enabled=true management.endpoints.web.exposure.include=prometheus
http://localhost:8080/prometheus
来获取 Prometheus 数据。pom.xml
或 build.gradle
文件中的依赖配置,确保版本正确且不冲突。示例 pom.xml
文件:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.7.5</version> </dependency>
示例日志:
2023-10-01 10:00:00 ERROR [main] o.s.boot.SpringApplication - Application run failed java.lang.ClassCastException: class com.example.demo.User cannot be cast to class com.example.demo.User
pom.xml
文件中添加 spring-boot-devtools
依赖。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
通过以上步骤和技巧,可以有效排查和解决 Spring Boot 应用中的常见错误,提高开发效率。