本文介绍了Spring Boot项目开发入门的相关内容,包括Spring Boot的基本概念、优点、特性和开发环境的搭建。文章详细讲解了开发环境配置、创建第一个Spring Boot项目以及核心配置。此外,还涵盖了常用功能实现、项目打包与部署等内容。
Spring Boot 是一个用来简化新 Spring 应用初始搭建以及开发过程的框架。Spring Boot 可以让你快速地搭建一个独立的、生产级别的 Spring 应用,你可以专注于应用的开发,而不是框架的复杂配置。
spring-boot-starter-*
方式引入依赖,简化依赖管理。spring-boot-actuator
提供生产级别的健康监控。application.properties
和 application.yml
文件配置。spring-boot-devtools
开发工具,支持热重载等特性。~/.bashrc
或 ~/.zshrc
文件,添加以下内容:
export JAVA_HOME=/usr/local/java/jdk-11.0.1 export PATH=$JAVA_HOME/bin:$PATH
java -version
命令验证 JDK 安装是否成功。推荐使用 IntelliJ IDEA 或 Spring Tool Suite(STS)进行开发。
~/.bashrc
或 ~/.zshrc
文件,添加以下内容:
export MAVEN_HOME=/usr/local/apache-maven-3.6.3 export PATH=$MAVEN_HOME/bin:$PATH
mvn -version
命令验证 Maven 安装是否成功。~/.bashrc
或 ~/.zshrc
文件,添加以下内容:
export GRADLE_HOME=/usr/local/gradle-6.8.3 export PATH=$GRADLE_HOME/bin:$PATH
gradle -v
命令验证 Gradle 安装是否成功。访问 Spring Initializr 生成项目。
Spring Web
和 Spring Data JPA
。项目结构如下:
src/ └── main ├── java │ └── com.example.demo │ ├── DemoApplication.java │ └── controller │ └── HelloController.java └── resources ├── application.properties └── static/ └── templates/
DemoApplication.java
:主程序入口。HelloController.java
:一个简单的控制器,提供 RESTful API。application.properties
:项目的配置文件。static/
:静态资源文件,如 HTML、CSS、JavaScript。templates/
:Thymeleaf 模板文件。在 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); } }
在 HelloController.java
中编写一个简单的控制器:
package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/") public String index() { return "Hello World!"; } }
运行项目:
http://localhost:8080
,可以看到输出 "Hello World!"。Spring Boot 的配置文件可以通过 application.properties
或 application.yml
来实现。这些配置文件位于 src/main/resources
目录下。
# 数据库配置 spring.datasource.url=jdbc:mysql://localhost:3306/dbname spring.datasource.username=root spring.datasource.password=root # 应用配置 server.port=8080 spring.application.name=my-app
spring: datasource: url: jdbc:mysql://localhost:3306/dbname username: root password: root server: port: 8080 application: name: my-app
在开发过程中,配置文件的变化通常需要重启应用才能生效。Spring Boot 提供了 spring-boot-devtools
来实现配置文件的热刷新。
在 pom.xml
或 build.gradle
中添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency>
dependencies { runtimeOnly 'org.springframework.boot:spring-boot-devtools' }
启用热刷新后,更改配置文件会自动重启应用。
Spring Boot Actuator 提供了生产级别的健康监控和指标收集功能。
在 pom.xml
或 build.gradle
中添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' }
启用 Actuator 后,访问 /actuator
可以看到健康状态、JVM 信息等。
使用 Spring Boot 实现 RESTful API 非常简单。我们已经创建了一个简单的 HelloController
示例:
package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/") public String index() { return "Hello World!"; } }
可以继续创建其他控制器,例如:
package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.ArrayList; @RestController public class UserController { @GetMapping("/users") public List<String> getAllUsers() { List<String> users = new ArrayList<>(); users.add("user1"); users.add("user2"); return users; } }
在 pom.xml
或 build.gradle
中添加 JPA 依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'mysql:mysql-connector-java' }
定义实体类:
package com.example.demo.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String username; private String password; public User() {} public User(String username, String password) { this.username = username; this.password = password; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
定义 Repository 接口:
package com.example.demo.repository; import com.example.demo.model.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { }
在 pom.xml
或 build.gradle
中添加 MyBatis 依赖:
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency>
dependencies { implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4' }
定义实体类:
package com.example.demo.model; public class User { private Long id; private String username; private String password; public User() {} public User(String username, String password) { this.username = username; this.password = password; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
定义 Mapper 接口:
package com.example.demo.mapper; import com.example.demo.model.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper { List<User> getAllUsers(); User getUserById(Long id); }
定义 Mapper XML 文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.UserMapper"> <select id="getAllUsers" resultType="com.example.demo.model.User"> SELECT * FROM users </select> <select id="getUserById" resultType="com.example.demo.model.User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>
使用 Spring Security 进行安全性配置:
在 pom.xml
或 build.gradle
中添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' }
自定义 WebSecurityConfigurerAdapter
:
package com.example.demo.config; 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 { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasRole("USER") .anyRequest().permitAll() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
定义用户详情服务:
package com.example.demo.security; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import com.example.demo.model.User; import com.example.demo.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Autowired private PasswordEncoder passwordEncoder; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found"); } return new org.springframework.security.core.userdetails.User( user.getUsername(), passwordEncoder.encode(user.getPassword()), true, true, true, true, new String[] { "ROLE_" + user.getRole().toUpperCase() }); } }
使用 Maven 或 Gradle 打包项目。
在项目根目录下运行:
mvn clean package
在项目根目录下运行:
./gradlew clean build
将打包后的 jar 文件上传到服务器。
直接运行 jar 文件:
java -jar target/demo-0.0.1-SNAPSHOT.jar
内存溢出:增加 JVM 内存配置,例如:
java -Xms512m -Xmx1024m -jar target/demo-0.0.1-SNAPSHOT.jar
配置文件问题:确保配置文件路径正确,格式正确。
依赖冲突:检查依赖冲突,排除冲突的依赖。
Spring Security 配置问题:确保安全性配置正确,没有遗漏任何配置。