æ¤å¿«éåèå¤å¿åæä¾äºä½¿ç¨ Spring Boot çç¨æ³
注ï¼å¼å springboot éè¦è¦åºæ¬ç java åºç¡å maven åºç¡ã
Spring Boot æ¯ä¸ä¸ªç¨äºç®å Spring åºç¨ç¨åºå¼åçæ¡æ¶ã宿ä¾äºä¸ç§ç®åçæ¹å¼æ¥å建ãè¿è¡åé¨ç½² Spring åºç¨ç¨åºï¼å¹¶ç®åäºé ç½®åä¾èµç®¡çã
Spring Initializr å建项ç®Spring Initializr å建项ç®ï¼éæ©ä¾èµé¡¹ï¼å¦WebãJPAãSecurityï¼å Spring Boot çæ¬pom.xml(Maven) æ build.gradle(Gradle) æä»¶ä¸src/main/resources ç®å½ä¸å建 application.propertiesæapplication.yml æä»¶ï¼é
ç½®åºç¨ç¨åºå±æ§ï¼ä¾å¦æ°æ®åºè¿æ¥ä¿¡æ¯ã端å£å·çå¨Spring Bootåºç¨ç¨åºä¸ï¼é常使ç¨YAMLæ ¼å¼ï¼.ymlæä»¶ï¼æ¥é
ç½®åºç¨ç¨åºç屿§å设置ãç¸æ¯äºä¼ ç»ç.propertiesæä»¶ï¼YAMLæ ¼å¼æ´å æ¸
æ°æè¯»ï¼å¹¶ä¸æ¯æå±çº§ç»æåå表çå¤ææ°æ®ç±»åã以䏿¯ä¸äºå¸¸ç¨çSpring Boot YAMLé
ç½®åæ®µåå
¶è¯´æï¼
server.port: é
ç½®åºç¨ç¨åºç端å£å·ãspring.application.name: é
ç½®åºç¨ç¨åºçåç§°ãspring.datasource.url: é
ç½®æ°æ®åºè¿æ¥çURLãspring.datasource.username: é
ç½®æ°æ®åºè¿æ¥çç¨æ·åãspring.datasource.password: é
ç½®æ°æ®åºè¿æ¥çå¯ç ãlogging.level: é
ç½®æ¥å¿è®°å½ç级å«ï¼å¦DEBUGãINFOãWARNãERRORçãmanagement.endpoints.web.exposure.include: é
ç½®åªäºç®¡ç端ç¹ï¼å¦healthãinfoï¼å¯ä»¥éè¿Web访é®ãspring.jpa.hibernate.ddl-auto: é
ç½®HibernateçDDL模å¼ï¼å¦updateãcreateãcreate-dropçãspring:
application:
name: my-application
spring.application.name: åºç¨ç¨åºçåç§°ãå¨éææå¡åç°åé
ç½®ç®¡çæ¶ç¹å«æç¨ï¼ä¹ä¼å½±åActuator端ç¹çè·¯å¾ã
server:
port: 8080
server.port: åºç¨ç¨åºçå¬çHTTP端å£å·ãé»è®¤ä¸º8080ï¼å¯ä»¥æ ¹æ®éè¦è¿è¡é
ç½®ã
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydatabase
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver # è¿éæ¯ MySQL8.0 çæ¬é
ç½®ï¼5.0 忝 com.mysql.jdbc.Driver
spring.datasource.url: æ°æ®åºè¿æ¥URLãspring.datasource.username å spring.datasource.password: æ°æ®åºçç¨æ·ååå¯ç ãspring.datasource.driver-class-name: æ°æ®åºé©±å¨ç±»åãspring:
jpa:
show-sql: true
hibernate:
ddl-auto: update
spring.jpa.show-sql: æ¯å¦å¨æ§å¶å°æ¾ç¤ºSQLè¯å¥ãspring.jpa.hibernate.ddl-auto: Hibernateèªå¨å»ºè¡¨çç¥ï¼å¦updateãcreateãvalidateçãlogging:
level:
org.springframework: INFO
com.example: DEBUG
logging.level: æ¥å¿çº§å«é
ç½®ï¼å¯ä»¥é对ä¸åçå
æç±»è®¾ç½®ä¸åçæ¥å¿çº§å«ãspring:
security:
user:
name: user
password: password
basic:
enabled: true
spring.security.user.name å spring.security.user.password: åºæ¬è®¤è¯çç¨æ·ååå¯ç ãspring.security.basic.enabled: æ¯å¦å¯ç¨åºæ¬è®¤è¯ãmanagement:
endpoints:
web:
exposure:
include: health, info
management.endpoints.web.exposure.include: æ´é²ç»å¤é¨çActuator端ç¹ï¼å¯ä»¥è®¾ç½®ä¸º*æ¥æ´é²ææç«¯ç¹ãspring:
profiles:
active: dev
spring.profiles.active: æå®å½åæ¿æ´»çç¯å¢é
ç½®æä»¶ï¼å¯ä»¥æ ¹æ®éè¦éæ©devãprodçä¸åçé
ç½®æä»¶ãmyapp:
custom:
property: value
@Value注解æEnvironment对象访é®ãSpring Boot ç Starter ä¾èµé¡¹æ¯é¢å
é
ç½®çä¸ç»ä¾èµé¡¹éåï¼å®ä»¬ä»¥ spring-boot-starter-* çå½åæ ¼å¼æä¾ãè¿äº Starter ä¾èµé¡¹å¯ä»¥æç
§åè½é¢åè¿è¡åç±»ï¼ä¾å¦ï¼
spring-boot-starter-web: æ¯ææå»ºWebåºç¨ç¨åºï¼å
æ¬Spring MVCåå
åµçServlet容å¨ï¼å¦Tomcatï¼ãspring-boot-starter-data-jpa: æ¯æä½¿ç¨Spring Data JPAè®¿é®æ°æ®åºï¼å
æ¬HibernateåJPAå®ç°ãspring-boot-starter-security: æ¯æSpring Securityï¼ç¨äºèº«ä»½éªè¯åææãspring-boot-starter-test: æ¯æåå
æµè¯åéææµè¯ï¼å
æ¬JUnitãMockitoçãspring-boot-starter-actuator: æ¯æéæActuatorï¼ç¨äºçæ§å管çåºç¨ç¨åºãå¼å ¥Starterä¾èµé¡¹å¯ä»¥å¿«éæ·»å ç¹å®åè½ï¼Spring Bootä¼èªå¨é ç½®æéçç»ä»¶å设置ï¼åå°æå¨é 置工ä½éã
Spring BootçBOMï¼Bill of Materialsï¼éä¸ç®¡çå个 Starter ä¾èµé¡¹ççæ¬ï¼éè¿å¨pom.xmlï¼Mavenï¼æ build.gradleï¼Gradleï¼ä¸å¼å
¥ BOMï¼å¯ä»¥ç®åä¾èµé¡¹çæ¬ç®¡çãä¾å¦ï¼å¨ Maven 项ç®ä¸ï¼
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
è¿æ ·ä¸æ¥ï¼å½ä½ å¨é¡¹ç®ä¸å¼å ¥ Spring Boot ç Starter ä¾èµé¡¹æ¶ï¼ä¸éè¦æ¾å¼å£°æçæ¬å·ï¼Maven ä¼èªå¨ä½¿ç¨ BOM 䏿å®ççæ¬ã
尽管Spring Bootæä¾äºä¸°å¯çStarterä¾èµé¡¹åä¾èµç®¡çåè½ï¼ä½ææ¶ä½ å¯è½éè¦èªå®ä¹ç¹å®çä¾èµé¡¹æçæ¬ãå¨è¿ç§æ
åµä¸ï¼ä½ å¯ä»¥å¨pom.xmlæbuild.gradle䏿¾å¼å£°ææéçä¾èµé¡¹ï¼èä¸ä½¿ç¨Starterä¾èµé¡¹ã
ä¾å¦ï¼å¨Maven项ç®ä¸ï¼ä½ å¯ä»¥è¿æ ·å£°æä¸ä¸ªä¾èµé¡¹ï¼
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.0</version>
</dependency>
è¿æ ·åå¯ä»¥è¦çSpring Boot BOM䏿å®ççæ¬ï¼å è®¸ä½ ä½¿ç¨ç¹å®çæ¬çä¾èµé¡¹ã
å¨å®é
项ç®ä¸ï¼å¯è½ä¼éå°ä¾èµé¡¹ä¹é´çå²çªæä¸å
¼å®¹æ§é®é¢ãSpring Bootå
è®¸ä½ éè¿<exclusions>æ ç¾æ¥æé¤Starterä¾èµé¡¹ä¸çæäºä¼ éæ§ä¾èµï¼ä»¥è§£å³å²çªé®é¢ã
ä¾å¦ï¼å¨Maven项ç®ä¸æé¤ä¼ éæ§ä¾èµï¼
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
è¿ç§æé¤æºå¶ä½¿å¾ä½ å¯ä»¥æ´ç²¾ç¡®å°æ§å¶é¡¹ç®ä¸ä¾èµé¡¹ççæ¬åç»åï¼ä»¥é¿å ä¸å¿ è¦çå²çªã
ä¾èµæ³¨å ¥æ¯Springæ¡æ¶çæ ¸å¿æ¦å¿µä¹ä¸ï¼å®éè¿æ§å¶å转ï¼IoCï¼Inversion of Controlï¼çæ¹å¼ç®¡ç对象ä¹é´çä¾èµå ³ç³»ï¼ä»èå®ç°æ¾è¦åã坿µè¯åå¯ç»´æ¤ç代ç ç»æãSpring Bootéè¿èªå¨é ç½®çæ¹å¼æ¯æä¾èµæ³¨å ¥ï¼ä»¥ä¸æ¯ä¸äºå ³é®ç¹ï¼
Spring Bootæ ¹æ®ç±»è·¯å¾ä¸çä¾èµé¡¹èªå¨é
ç½®åºç¨ç¨åºä¸ä¸æãè¿å
æ¬èªå¨æ«æå注å带æç¹å®æ³¨è§£ï¼å¦@Componentã@Serviceã@Repositoryçï¼çBeanï¼ä»¥åèªå¨è§£æå注å
¥è¿äºBeanä¹é´çä¾èµå
³ç³»ã
å¼åè
å¯ä»¥ä½¿ç¨@Autowired注解å¨éè¦ä¾èµæ³¨å
¥çå°æ¹æ³¨å
¥å
¶ä»Beanï¼Spring Bootä¼èªå¨è§£æå注å
¥æéçä¾èµãä¾å¦ï¼
@RestController
public class MyContr {
private final MyService myService;
@Autowired
public MyContr(MyService myService) {
this.myService = myService;
}
// Controller methods
}
å¨ä¸é¢çä¾åä¸ï¼MyControllerä¸çMyServiceä¾èµéè¿æé 彿°æ³¨å
¥ã
Spring Bootæ¯ææ ¹æ®æ¡ä»¶éæ©æ§å°æ³¨å
¥Beanãä¾å¦ï¼å¯ä»¥ä½¿ç¨ @Conditional 注解æ @ConditionalOnProperty æ³¨è§£æ ¹æ®ç¹å®çæ¡ä»¶å³å®æ¯å¦åå»ºåæ³¨å
¥Beanã
é¢ååé¢ç¼ç¨æ¯ä¸ç§è½¯ä»¶å¼åæ¹æ³ï¼ç¨äºå离横åå ³æ³¨ç¹ï¼cross-cutting concernsï¼ï¼ä¾å¦æ¥å¿ãäºå¡ç®¡çãå®å ¨æ§çï¼ä»¥ä¾¿æ´å¥½å°æ¨¡ååå管çåºç¨ç¨åºãSpring Bootéè¿æ´åSpring AOPæ¡æ¶æ¯æé¢ååé¢ç¼ç¨ï¼ä»¥ä¸æ¯ç¸å ³ç说æï¼
å颿¯ä¸ä¸ªæ¨¡ååçç±»ï¼å®å
å«äºæ¨ªåå
³æ³¨ç¹çé»è¾ãå¨Spring Bootä¸ï¼å¯ä»¥ä½¿ç¨@Aspect注解æ è®°ä¸ä¸ªç±»ä½ä¸ºåé¢ï¼å¹¶éè¿@Beforeã@Afterã@Aroundçæ³¨è§£å®ä¹åé¢çå
·ä½è¡ä¸ºã
åç¹å®ä¹äºå¨åºç¨ç¨åºä¸åªäºä½ç½®åºç¨åé¢é»è¾ãåç¹è¡¨è¾¾å¼ä½¿ç¨executionå
³é®åæå®è¦æ¦æªçæ¹æ³è°ç¨ãä¾å¦ï¼
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void beforeServiceMethods(JoinPoint joinPoint) {
// Advice logic before service method execution
}
// Other advices (e.g., @After, @Around) can be defined similarly
}
éç¥æ¯å¨åç¹å¤æ§è¡çå
·ä½é»è¾ï¼å
æ¬@Beforeã@AfterReturningã@AfterThrowingã@Aroundçãä¾å¦ï¼å¨ä¸é¢çä¾åä¸ï¼beforeServiceMethodsæ¹æ³å°±æ¯ä¸ä¸ª@Beforeéç¥ï¼å®å¨ç®æ æ¹æ³æ§è¡ä¹åæ§è¡ã
Spring Bootéè¿èªå¨é
ç½®åæ³¨è§£æ«æä½¿å¾ä½¿ç¨AOPåå¾é常ç®åãé常æ
åµä¸ï¼åªéå¨åé¢ç±»ä¸å ä¸@Aspect注解ï¼å¹¶ç¡®ä¿å®è¢«Spring Bootçç»ä»¶æ«ææºå¶æ«æå°å³å¯ã
ä½ å¯ä»¥ä½¿ç¨ Spring Initializr å建ä¸ä¸ªæ°ç Spring Boot 项ç®ãè®¿é® start.spring.io å¹¶æç §ä»¥ä¸é ç½®å建项ç®ï¼
ç¹å» "Generate" ä¸è½½é¡¹ç®ç zip æä»¶ã
è§£åä¸è½½çæä»¶å¹¶å¯¼å ¥å°ä½ 忬¢ç IDE ä¸ï¼å¦ IntelliJ IDEAãEclipse çï¼ã
å¨ IDE 䏿å¼ä½ ç项ç®ï¼å¯¼èªå° src/main/java/com/example/helloworldãä½ ä¼çå°ä¸ä¸ªå为 HelloworldApplication.java çç±»æä»¶ï¼è¿æ¯ Spring Boot åºç¨ç¨åºçå
¥å£ç±»ã
å¨è¿ä¸ªç±»çå级ç®å½ä¸å建ä¸ä¸ªæ°ç Java ç±»æä»¶ï¼ä¾å¦ HelloController.javaï¼å¹¶æ·»å 以ä¸å
容ï¼
package com.example.helloworld;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/")
public String hello() {
return "Hello, World!";
}
}
ä½¿ç¨ Maven æ Gradle æå»ºé¡¹ç®å¹¶å¯å¨åºç¨ç¨åºãå¯ä»¥éè¿ IDE çè¿è¡åè½æè å½ä»¤è¡æ§è¡ä»¥ä¸å½ä»¤ï¼
mvn spring-boot:run
æè
./gradlew bootRun
卿µè§å¨ä¸è®¿é® http://localhost:8080/ï¼ä½ åºè¯¥è½å¤çå°æ¾ç¤º "Hello, World!" ç页é¢ã
è¿æ ·ï¼ä½ å°±æåå建äºä¸ä¸ªç®åç Spring Boot Web åºç¨ç¨åºï¼å¹¶å®ç°äºä¸ä¸ªåºæ¬ç "Hello, World!" 示ä¾ã
注æï¼éè¦éæ© jpa åå¯¹åºæ°æ®åºç驱å¨
é»è®¤æ
åµä¸ï¼Spring Boot ä½¿ç¨ H2 Database ä½ä¸ºå
嵿°æ®åºãå¦æä½ æ³ä½¿ç¨å
¶ä»æ°æ®åºï¼å¯ä»¥å¨ application.propertiesï¼æ application.ymlï¼æä»¶ä¸é
ç½®æ°æ®åºè¿æ¥ä¿¡æ¯ã
ä¾å¦ï¼ä½¿ç¨ H2 Database çé»è®¤é ç½®ï¼
# application.properties
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=username
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto=update
å建ä¸ä¸ªç®åçæ§å¶å¨ UserControllerï¼ç¨æ¥å¤ç HTTP 请æ±ï¼å¹¶æä½ UserRepository æ¥è®¿é®æ°æ®åºã
package com.example.userdemo;
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 UserRepository userRepository;
// è·åææç¨æ·
@GetMapping("/")
public List<User> getAllUsers() {
return userRepository.findAll();
}
// éè¿ id è·åç¨æ·
@GetMapping("/{id}")
public User getUserById(@PathVariable("id") Long id) {
return userRepository.findById(id).orElse(null);
}
// POST å建æ°ç¨æ·
@PostMapping("/")
public User addUser(@RequestBody User user) {
return userRepository.save(user);
}
// PUT æ´æ°ç¨æ·
@PutMapping("/{id}")
public User updateUser(@PathVariable("id") Long id, @RequestBody User userDetails) {
User user = userRepository.findById(id).orElse(null);
if (user != null) {
user.setUsername(userDetails.getUsername());
user.setAge(userDetails.getAge());
user.setSex(userDetails.getSex());
return userRepository.save(user);
}
return null;
}
// DELETE å é¤ç¨æ·
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable("id") Long id) {
userRepository.deleteById(id);
}
}
å¨åæ ·çç®å½ä¸å建ä¸ä¸ªæ¥å£ UserRepositoryï¼ç»§æ¿èª JpaRepository<User, Long>ï¼è¿æ · Spring Data JPA å°ä¼èªå¨å®ç°ä¸äºåºæ¬çæ°æ®åºæä½æ¹æ³ã
package com.example.userdemo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
Userå¨ src/main/java/com/example/userdemo ç®å½ä¸å建ä¸ä¸ªå为 User çå®ä½ç±»ï¼
package com.example.userdemo;
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 userId;
private String username;
private Integer age;
private String sex;
// Constructors, getters, and setters çç¥
}
ä½¿ç¨ Maven æ Gradle æå»ºå¹¶è¿è¡ä½ çåºç¨ç¨åºãç¶åï¼å¯ä»¥ä½¿ç¨ Postman ææµè§å¨è®¿é®ä»¥ä¸ API æ¥æµè¯ä½ çåºç¨ç¨åºï¼
http://localhost:8080/users/
è·åææç¨æ·http://localhost:8080/users/{id}http://localhost:8080/users/http://localhost:8080/users/{id}http://localhost:8080/users/{id}å¨ src/main/java/com/example/demo ç®å½ä¸å建ä¸ä¸ªå为 HelloController.java çç±»ï¼
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!";
}
}
å建è¿ç¨å web 项ç®å建
å¨ src/test/java/com/example/demo ç®å½ä¸å建ä¸ä¸ªå为 HelloControllerTest.java çæµè¯ç±»ï¼
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void helloTest() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/hello"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("Hello, World!"))
.andDo(print());
}
}
@SpringBootTest: è¿ä¸ªæ³¨è§£åè¯ Spring Boot 卿µè¯æ¶å¯å¨æ´ä¸ª Spring åºç¨ç¨åºä¸ä¸æã@AutoConfigureMockMvc: è¿ä¸ªæ³¨è§£ç¡®ä¿å¨æµè¯ä¸èªå¨é
ç½® MockMvc å®ä¾ï¼ç¨äºæ¨¡æ HTTP 请æ±ã@Autowired private MockMvc mockMvc: 注å
¥ MockMvc å®ä¾ï¼ç¨äºæ§è¡ HTTP 请æ±å¹¶éªè¯ååºã@Test public void helloTest(): è¿æ¯ä¸ä¸ª JUnit æµè¯æ¹æ³ï¼ç¨æ¥æµè¯ HelloController ä¸ç hello() æ¹æ³ãmockMvc.perform(...): æ§è¡ä¸ä¸ª GET 请æ±å° /hello æ¥å£ãandExpect(MockMvcResultMatchers.status().isOk()): 颿ååºçç¶æç æ¯ 200 OKãandExpect(MockMvcResultMatchers.content().string("Hello, World!")): 颿ååºçå
å®¹æ¯ "Hello, World!"ãandDo(print()): æå°è¯·æ±åååºç详ç»ä¿¡æ¯ï¼æ¹ä¾¿è°è¯ãè¿è¡æµè¯ï¼ç¡®ä¿ç¨åºæ£ç¡®.
Spring Boot åºç¨ç¨åºå¯ä»¥æå 为以ä¸å ç§æ¹å¼ä¹ä¸ï¼
java -jar å½ä»¤æ¥è¿è¡ãå½ä½ è¿è¡ Maven çæå»ºå½ä»¤æ¶ï¼å®ä»¬ä¼æ§è¡ä»¥ä¸å ä¸ªä¸»è¦æ¥éª¤æ¥æå ä½ çåºç¨ç¨åºï¼
ä¾èµé¡¹è§£æåä¸è½½ï¼æå»ºå·¥å
·ä¼æ£æ¥ä½ 项ç®ä¸çä¾èµé¡¹ï¼ä¸è½½ç¼ºå¤±çä¾èµå¹¶æå»ºæ´ä¸ªä¾èµæ ãç¼è¯ä»£ç ï¼æå»ºå·¥å
·ä¼ç¼è¯ä½ ç Java 代ç ãèµæºæä»¶çãè¿è¡æµè¯ï¼é叏伿§è¡åå
æµè¯åéææµè¯ï¼ç¡®ä¿ä»£ç è´¨éååè½æ£ç¡®æ§ãæå
åºç¨ç¨åºï¼
è¾åºç»æï¼æå»ºå·¥å
·ä¼å¨æå®çç®å½ä¸çææå
好ç JAR æ WAR æä»¶ï¼é常ä½äº target ç®å½ä¸ï¼Mavenï¼ãå¨ä½ ç Spring Boot 项ç®ä¸ï¼é常æä¸ä¸ªå
¥å£ç±»ï¼å¦ Application.java æè
æ ¹æ®ä½ ç项ç®å½åï¼ãè¿ä¸ªç±»ä½¿ç¨ @SpringBootApplication 注解æ è®°ï¼å®å
å«äº main æ¹æ³ç¨æ¥å¯å¨åºç¨ç¨åºã
é常使ç¨ä»¥ä¸ä¸¤ç§æå»ºå·¥å ·æ¥æå Spring Boot åºç¨ç¨åºï¼
mvn package å½ä»¤å¯ä»¥å°åºç¨ç¨åºæå
为 JAR æ WAR æä»¶ãpom.xml æä»¶ä¸ï¼Spring Boot åºç¨ç¨åºé常ä¼ä¾èµäº spring-boot-starter-parent ç¶é¡¹ç®ï¼è¿ç®åäº Maven é
ç½®åä¾èµç®¡çãåè®¾ä½ æä¸ä¸ªç®åç Spring Boot åºç¨ç¨åºï¼å¹¶ä¸å·²ç»é ç½®å¥½äº Maven æ Gradleãè¿è¡ä»¥ä¸å½ä»¤å³å¯è¿è¡æå ï¼
mvn clean packageæå»ºå·¥å ·ä¼æ§è¡ä»¥ä¸æ¥éª¤ï¼çæå¯æ§è¡ç JAR æä»¶æ WAR æä»¶ï¼ä½ å¯ä»¥æ ¹æ®éè¦è¿è¡é¨ç½²åè¿è¡ã