最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 3X 框架核心組件的使用詳解

 更新時(shí)間:2026年02月12日 11:12:23   作者:符哥2008  
SpringBoot核心組件詳解,涵蓋Starter依賴(lài)、自動(dòng)配置、主啟動(dòng)類(lèi)、配置文件、核心注解、Web開(kāi)發(fā)、數(shù)據(jù)訪問(wèn)和效率提升組件,適合企業(yè)開(kāi)發(fā),本文介紹Spring Boot 3X 框架核心組件的使用,感興趣的朋友跟隨小編一起看看吧

Spring Boot 框架核心組件的完整使用詳解,我會(huì)聚焦 Spring Boot 最常用、企業(yè)開(kāi)發(fā)必備的核心組件,從組件核心作用、配置方式、實(shí)戰(zhàn)代碼、使用場(chǎng)景四個(gè)維度講解,基于Spring Boot 3.2.x(最新穩(wěn)定版,適配 Java 17+、Spring 6),所有代碼都是可直接復(fù)制的開(kāi)箱即用版本,同時(shí)兼顧注解式配置(主流)和核心原理極簡(jiǎn)解讀,讓你既能快速上手使用,也能理解組件間的配合邏輯。

前置基礎(chǔ)

Spring Boot 的核心是約定大于配置,通過(guò)自動(dòng)配置(AutoConfiguration) 消除 Spring 原生的繁瑣 XML 配置,所有組件都基于Starter 起步依賴(lài)引入,只需少量配置(甚至零配置)即可使用。

  • 核心依賴(lài):spring-boot-starter(基礎(chǔ)核心),所有組件都基于此擴(kuò)展;
  • 開(kāi)發(fā)工具:spring-boot-starter-devtools(熱部署)、spring-boot-configuration-processor(配置提示);
  • 構(gòu)建方式:Maven/Gradle(本文以 Maven 為例,適配 IDEA 默認(rèn)工程)。

一、核心基礎(chǔ)組件(所有項(xiàng)目必用)

1. Starter 起步依賴(lài)(組件入口)

核心作用

Starter 是 Spring Boot 的組件依賴(lài)封裝,將某個(gè)功能的所有相關(guān)依賴(lài)(如核心包、依賴(lài)包、配置包)整合為一個(gè) Maven/Gradle 依賴(lài),只需引入 1 個(gè) Starter,即可自動(dòng)引入該功能的所有必要依賴(lài),避免手動(dòng)管理依賴(lài)版本、解決依賴(lài)沖突。

核心設(shè)計(jì)

  • 命名規(guī)范:官方 Starter 為spring-boot-starter-*(如spring-boot-starter-web),第三方 Starter 為*spring-boot-starter(如mybatis-spring-boot-starter);
  • 自動(dòng)配置:Starter 內(nèi)置META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,指定該組件的自動(dòng)配置類(lèi),Spring Boot 啟動(dòng)時(shí)會(huì)自動(dòng)加載。

實(shí)戰(zhàn)使用(pom.xml)

<!-- 基礎(chǔ)核心Starter(所有Spring Boot項(xiàng)目必加) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Web開(kāi)發(fā)Starter(MVC+Tomcat,后端接口必加) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 測(cè)試Starter(Junit5+MockMvc,單元測(cè)試必加) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

2. 主啟動(dòng)類(lèi)(@SpringBootApplication)

核心作用

Spring Boot 項(xiàng)目的入口類(lèi),通過(guò)注解開(kāi)啟自動(dòng)配置、組件掃描、配置屬性綁定三大核心功能,是項(xiàng)目啟動(dòng)的唯一入口。

核心注解拆解(@SpringBootApplication 是復(fù)合注解)

// 核心復(fù)合注解,等價(jià)于以下三個(gè)注解的組合
@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
  • @SpringBootConfiguration:繼承自@Configuration,標(biāo)記該類(lèi)為配置類(lèi),可在類(lèi)中用@Bean聲明自定義組件;
  • @EnableAutoConfiguration:開(kāi)啟自動(dòng)配置,加載所有 Starter 的自動(dòng)配置類(lèi),實(shí)現(xiàn) “零配置” 使用組件;
  • @ComponentScan:開(kāi)啟組件掃描,自動(dòng)掃描當(dāng)前包及其子包下的@Controller/@Service/@Repository/@Component注解類(lèi),將其注冊(cè)為 Spring Bean。

實(shí)戰(zhàn)使用(主啟動(dòng)類(lèi)代碼)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// 注解加在主類(lèi)上,掃描包:com.example.demo及其所有子包
@SpringBootApplication
// 可選:指定掃描包(若主類(lèi)不在項(xiàng)目根包,需手動(dòng)指定)
// @SpringBootApplication(scanBasePackages = "com.example")
public class SpringBootComponentDemoApplication {
    // 項(xiàng)目啟動(dòng)入口方法,固定寫(xiě)法
    public static void main(String[] args) {
        // 啟動(dòng)Spring Boot應(yīng)用,返回Spring容器(ApplicationContext)
        SpringApplication.run(SpringBootComponentDemoApplication.class, args);
    }
}

關(guān)鍵注意

主啟動(dòng)類(lèi)建議放在項(xiàng)目根包(如com.example.demo),否則需用scanBasePackages手動(dòng)指定掃描包,否則子包的組件無(wú)法被 Spring 掃描并注冊(cè)。

3. 配置文件(application.yml/properties)

核心作用

Spring Boot 的全局配置文件,用于覆蓋組件的默認(rèn)自動(dòng)配置(如端口、數(shù)據(jù)庫(kù)連接、日志級(jí)別),支持yml(推薦,層級(jí)清晰)properties(鍵值對(duì)) 兩種格式,項(xiàng)目啟動(dòng)時(shí)會(huì)自動(dòng)加載src/main/resources/下的該文件。

配置優(yōu)先級(jí)

application-dev.yml(開(kāi)發(fā)環(huán)境) > application-prod.yml(生產(chǎn)環(huán)境) > application.yml(全局默認(rèn)),可通過(guò)多環(huán)境配置切換不同環(huán)境的配置。

核心使用

(1)基礎(chǔ)配置(application.yml,修改默認(rèn)端口 / 上下文路徑)

# 服務(wù)器配置(覆蓋spring-boot-starter-web的默認(rèn)配置)
server:
  port: 8081 # 項(xiàng)目啟動(dòng)端口,默認(rèn)8080
  servlet:
    context-path: /demo # 接口上下文路徑,默認(rèn)/,訪問(wèn)時(shí)需加/demo(如http://localhost:8081/demo/hello)
# Spring核心配置
spring:
  application:
    name: spring-boot-component-demo # 項(xiàng)目名稱(chēng),服務(wù)注冊(cè)/日志中會(huì)使用

(2)多環(huán)境配置(最常用,避免開(kāi)發(fā) / 生產(chǎn)配置混用)

  1. 新建多環(huán)境配置文件:
    • 開(kāi)發(fā)環(huán)境:application-dev.yml(本地開(kāi)發(fā),端口 8081,日志級(jí)別 DEBUG)
    • 生產(chǎn)環(huán)境:application-prod.yml(線上部署,端口 80,日志級(jí)別 INFO)
  2. application.yml中指定激活的環(huán)境
spring:
  profiles:
    active: dev # 激活開(kāi)發(fā)環(huán)境,改為prod即切換到生產(chǎn)環(huán)境

(3)自定義配置與屬性綁定(@Value/@ConfigurationProperties)

開(kāi)發(fā)中常需要自定義配置(如自定義接口前綴、業(yè)務(wù)常量),Spring Boot 提供兩種方式綁定到 Java 類(lèi):

方式 1:@Value(簡(jiǎn)單配置,單個(gè)屬性綁定)適合單個(gè) / 少量自定義屬性,直接在 Bean 中注入:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    // 綁定yml中的自定義配置:app.api-prefix
    @Value("${app.api-prefix:/api/v1}") // 冒號(hào)后為默認(rèn)值,若配置中無(wú)該屬性則使用默認(rèn)值
    private String apiPrefix;
    @GetMapping("/hello")
    public String hello() {
        return "Hello Spring Boot! 接口前綴:" + apiPrefix;
    }
}

對(duì)應(yīng)的 yml 配置:

# 自定義配置
app:
  api-prefix: /api/v2

方式 2:@ConfigurationProperties(復(fù)雜配置,批量綁定)適合多個(gè)相關(guān)自定義屬性(如微信配置、OSS 配置),批量綁定到一個(gè)配置類(lèi),更規(guī)范、支持配置提示:步驟 1:編寫(xiě)配置類(lèi),添加注解:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
// 組件注解:將該類(lèi)注冊(cè)為Spring Bean
@Component
// 配置前綴:綁定yml中的wechat節(jié)點(diǎn)下的所有屬性
@ConfigurationProperties(prefix = "wechat")
public class WechatProperties {
    // 與yml中的屬性名一致(駝峰自動(dòng)匹配橫杠命名:app-id → appId)
    private String appId;
    private String appSecret;
    private String mchId; // 商戶(hù)號(hào)
    // 必須提供getter/setter,否則無(wú)法綁定(Lombok的@Data可自動(dòng)生成)
    public String getAppId() { return appId; }
    public void setAppId(String appId) { this.appId = appId; }
    public String getAppSecret() { return appSecret; }
    public void setAppSecret(String appSecret) { this.appSecret = appSecret; }
    public String getMchId() { return mchId; }
    public void setMchId(String mchId) { this.mchId = mchId; }
}

步驟 2:yml 中添加對(duì)應(yīng)配置:

# 微信配置
wechat:
  app-id: wx1234567890abcdef
  app-secret: 1234567890abcdef1234567890abcdef
  mch-id: 1234567890

步驟 3:在業(yè)務(wù)類(lèi)中注入使用:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WechatController {
    // 注入配置類(lèi)
    @Autowired
    private WechatProperties wechatProperties;
    @GetMapping("/wechat/info")
    public String wechatInfo() {
        return "微信AppId:" + wechatProperties.getAppId() + ",商戶(hù)號(hào):" + wechatProperties.getMchId();
    }
}

步驟 4:添加配置提示依賴(lài)(可選,IDEA 中顯示配置注解,避免手敲錯(cuò)誤):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

4. 核心注解(Bean 注冊(cè)與依賴(lài)注入)

Spring Boot 的所有組件都基于Spring IOC 容器,核心是將對(duì)象交給 Spring 管理(Bean 注冊(cè)) + 從 Spring 容器中獲取對(duì)象(依賴(lài)注入),以下是最核心的注解,所有業(yè)務(wù)開(kāi)發(fā)都離不開(kāi):

(1)Bean 注冊(cè)注解(將類(lèi)交給 Spring 管理)

標(biāo)記在類(lèi)上,Spring 啟動(dòng)時(shí)會(huì)自動(dòng)掃描并創(chuàng)建該類(lèi)的實(shí)例,存入 IOC 容器,全局唯一(默認(rèn)單例)。

注解作用適用場(chǎng)景
@Component通用 Bean 注冊(cè)注解通用工具類(lèi)、非業(yè)務(wù)層類(lèi)
@Controller繼承自 @Component,標(biāo)記控制層接口請(qǐng)求處理類(lèi)(接收請(qǐng)求、返回響應(yīng))
@Service繼承自 @Component,標(biāo)記服務(wù)層業(yè)務(wù)邏輯處理類(lèi)(核心業(yè)務(wù)、事務(wù)控制)
@Repository繼承自 @Component,標(biāo)記數(shù)據(jù)訪問(wèn)層數(shù)據(jù)庫(kù)操作類(lèi)(DAO/Mapper,MyBatis 中一般用 @Mapper 替代)
@Configuration標(biāo)記配置類(lèi)聲明自定義 Bean(如第三方組件配置、攔截器配置)

(2)依賴(lài)注入注解(從 Spring 容器中獲取 Bean)

標(biāo)記在字段 / 構(gòu)造方法 /setter 方法上,Spring 會(huì)自動(dòng)從 IOC 容器中找到對(duì)應(yīng)的 Bean,注入到當(dāng)前類(lèi)中,無(wú)需手動(dòng)new對(duì)象,實(shí)現(xiàn)解耦

注解作用特點(diǎn)
@Autowired類(lèi)型注入 BeanSpring 核心注解,自動(dòng)匹配類(lèi)型,支持required = false(非必須注入)
@Resource名稱(chēng)注入 Bean(JDK 原生)若有多個(gè)同類(lèi)型 Bean,可通過(guò)name指定,如@Resource(name = "userServiceImpl")
@Qualifier配合 @Autowired,按名稱(chēng)注入解決同類(lèi)型多個(gè) Bean 的注入問(wèn)題,如@Autowired + @Qualifier("userServiceImpl")

(3)自定義 Bean 聲明(@Bean)

標(biāo)記在配置類(lèi)的方法上,用于將第三方組件 / 無(wú)注解的類(lèi)注冊(cè)為 Spring Bean(如 RedisTemplate、RestTemplate),方法返回值即為 Bean 實(shí)例,方法名為 Bean 名稱(chēng)。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
// 配置類(lèi)
@Configuration
public class WebConfig {
    // 聲明RestTemplate為Spring Bean,全局可注入使用
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

使用時(shí)直接注入:

@Autowired
private RestTemplate restTemplate; // 無(wú)需new,直接使用

二、Web 開(kāi)發(fā)核心組件(后端接口必用)

基于spring-boot-starter-web,實(shí)現(xiàn) RESTful 接口開(kāi)發(fā),包含MVC 核心、請(qǐng)求處理、響應(yīng)處理、攔截器、跨域等,是后端開(kāi)發(fā)最核心的組件。

1. @RestController & @Controller(請(qǐng)求處理核心)

核心區(qū)別

  • @RestController = @Controller + @ResponseBody返回 JSON 數(shù)據(jù)(RESTful 接口首選),所有方法的返回值都會(huì)自動(dòng)序列化為 JSON,無(wú)需手動(dòng)加 @ResponseBody;
  • @Controller返回視圖(傳統(tǒng) SSM 開(kāi)發(fā),如 JSP/Thymeleaf),適合前后端不分離項(xiàng)目,若需返回 JSON,需在方法上加@ResponseBody。

實(shí)戰(zhàn)使用(RESTful 接口)

import org.springframework.web.bind.annotation.*;
// 標(biāo)記為RestController,所有方法返回JSON
@RestController
// 類(lèi)級(jí)別的請(qǐng)求路徑,所有方法的路徑都基于此(如/hello → /user/hello)
@RequestMapping("/user")
public class UserController {
    // GET請(qǐng)求:查詢(xún)用戶(hù),路徑/ user /get/{id}(路徑參數(shù))
    @GetMapping("/get/{id}")
    // @PathVariable:獲取URL路徑中的參數(shù)
    public String getUser(@PathVariable Long id) {
        return "{\"id\":" + id + ", \"name\":\"張三\", \"age\":25}";
    }
    // POST請(qǐng)求:新增用戶(hù),接收J(rèn)SON參數(shù)
    @PostMapping("/add")
    // @RequestBody:將請(qǐng)求體的JSON字符串綁定到User對(duì)象(自動(dòng)反序列化)
    public String addUser(@RequestBody User user) {
        return "新增用戶(hù)成功:" + user.getName();
    }
    // GET請(qǐng)求:分頁(yè)查詢(xún),接收請(qǐng)求參數(shù)(如/page?pageNum=1&pageSize=10)
    @GetMapping("/page")
    // @RequestParam:獲取請(qǐng)求參數(shù),支持默認(rèn)值
    public String pageQuery(@RequestParam Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) {
        return "分頁(yè)查詢(xún):第" + pageNum + "頁(yè),每頁(yè)" + pageSize + "條";
    }
}
// 實(shí)體類(lèi)(配合@RequestBody使用,需提供getter/setter,Lombok@Data可簡(jiǎn)化)
class User {
    private Long id;
    private String name;
    private Integer age;
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setId(String name) { this.name = name; }
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
}

核心請(qǐng)求注解(@GetMapping/@PostMapping 等)

都是@RequestMapping的簡(jiǎn)化版,指定請(qǐng)求方式,避免在 @RequestMapping 中手動(dòng)設(shè)置method = RequestMethod.GET

  • @GetMapping:處理 GET 請(qǐng)求(查詢(xún))
  • @PostMapping:處理 POST 請(qǐng)求(新增)
  • @PutMapping:處理 PUT 請(qǐng)求(修改)
  • @DeleteMapping:處理 DELETE 請(qǐng)求(刪除)
  • @PatchMapping:處理 PATCH 請(qǐng)求(局部修改)

2. 全局異常處理(@RestControllerAdvice + @ExceptionHandler)

核心作用

統(tǒng)一處理項(xiàng)目中所有的未捕獲異常,避免接口返回默認(rèn)的 500 錯(cuò)誤頁(yè)面 / 雜亂的異常信息,返回統(tǒng)一的 JSON 格式響應(yīng),提升接口的友好性和可維護(hù)性。

核心注解

  • @RestControllerAdvice:全局異常處理類(lèi)注解,繼承自@ControllerAdvice,配合@ExceptionHandler使用,返回 JSON 數(shù)據(jù);
  • @ExceptionHandler:標(biāo)記異常處理方法,指定處理的異常類(lèi)型(如Exception.class處理所有異常,NullPointerException.class處理空指針異常)。

實(shí)戰(zhàn)使用(統(tǒng)一異常返回)

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
// 全局異常處理,作用于所有@RestController
@RestControllerAdvice
public class GlobalExceptionHandler {
    // 處理所有未捕獲的異常(兜底)
    @ExceptionHandler(Exception.class)
    public Map<String, Object> handleAllException(Exception e) {
        Map<String, Object> result = new HashMap<>();
        result.put("code", HttpStatus.INTERNAL_SERVER_ERROR.value()); // 500
        result.put("msg", "服務(wù)器內(nèi)部錯(cuò)誤:" + e.getMessage()); // 異常信息
        result.put("data", null);
        return result;
    }
    // 處理自定義業(yè)務(wù)異常(推薦,項(xiàng)目中自定義異常,精準(zhǔn)處理)
    @ExceptionHandler(BusinessException.class)
    public Map<String, Object> handleBusinessException(BusinessException e) {
        Map<String, Object> result = new HashMap<>();
        result.put("code", e.getCode()); // 自定義錯(cuò)誤碼
        result.put("msg", e.getMsg()); // 自定義錯(cuò)誤信息
        result.put("data", null);
        return result;
    }
    // 處理空指針異常(精準(zhǔn)處理特定異常)
    @ExceptionHandler(NullPointerException.class)
    public Map<String, Object> handleNPE(NullPointerException e) {
        Map<String, Object> result = new HashMap<>();
        result.put("code", 400);
        result.put("msg", "空指針異常:" + e.getMessage());
        result.put("data", null);
        return result;
    }
}
// 自定義業(yè)務(wù)異常(項(xiàng)目中建議創(chuàng)建,用于業(yè)務(wù)邏輯錯(cuò)誤)
class BusinessException extends RuntimeException {
    private Integer code;
    private String msg;
    public BusinessException(Integer code, String msg) {
        super(msg);
        this.code = code;
        this.msg = msg;
    }
    public Integer getCode() { return code; }
    public String getMsg() { return msg; }
}

使用自定義異常(業(yè)務(wù)層中拋出)

@Service
public class UserService {
    public void deleteUser(Long id) {
        if (id == null || id <= 0) {
            // 拋出自定義業(yè)務(wù)異常,由全局異常處理器處理
            throw new BusinessException(400, "用戶(hù)ID不合法");
        }
        // 業(yè)務(wù)邏輯:刪除用戶(hù)
    }
}

3. 攔截器(Interceptor)

核心作用

攔截接口請(qǐng)求,在請(qǐng)求處理前、處理后、視圖渲染后(Rest 接口無(wú)此步驟) 執(zhí)行自定義邏輯,如登錄驗(yàn)證、接口限流、日志記錄、參數(shù)校驗(yàn)等。

實(shí)現(xiàn)步驟

  1. 實(shí)現(xiàn)HandlerInterceptor接口,重寫(xiě)攔截方法;
  2. 在配置類(lèi)中實(shí)現(xiàn)WebMvcConfigurer接口,重寫(xiě)addInterceptors方法,注冊(cè)攔截器并指定攔截 / 放行路徑。

實(shí)戰(zhàn)使用(登錄驗(yàn)證攔截器)

// 步驟1:實(shí)現(xiàn)HandlerInterceptor,編寫(xiě)攔截邏輯
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
    // 核心方法:請(qǐng)求處理前執(zhí)行(return true:放行,return false:攔截)
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 邏輯:從請(qǐng)求頭獲取token,驗(yàn)證是否登錄
        String token = request.getHeader("token");
        if (token == null || token.isEmpty()) {
            // 未登錄,返回401錯(cuò)誤
            response.setStatus(401);
            response.getWriter().write("{\"code\":401, \"msg\":\"未登錄,請(qǐng)先登錄\", \"data\":null}");
            return false; // 攔截請(qǐng)求
        }
        // 登錄驗(yàn)證通過(guò),放行
        return true;
    }
    // 可選:請(qǐng)求處理后執(zhí)行(控制器方法執(zhí)行完,未返回響應(yīng)前)
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    // 可選:視圖渲染后執(zhí)行(Rest接口無(wú)需實(shí)現(xiàn))
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
// 步驟2:配置類(lèi)中注冊(cè)攔截器
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    // 注冊(cè)攔截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**") // 攔截所有路徑
                .excludePathPatterns("/user/login", "/user/register"); // 放行登錄/注冊(cè)接口
    }
}

4. 跨域配置(CORS)

核心作用

解決前后端分離項(xiàng)目中的跨域問(wèn)題(瀏覽器同源策略限制:協(xié)議、域名、端口任一不同即為跨域,如前端http://localhost:3000訪問(wèn)后端http://localhost:8081)。

實(shí)戰(zhàn)實(shí)現(xiàn)(兩種方式,推薦全局配置)

方式 1:全局跨域配置(推薦,作用于所有接口)

WebMvcConfig中重寫(xiě)addCorsMappings方法:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    // 全局跨域配置
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 允許所有路徑跨域
                .allowedOriginPatterns("*") // 允許所有域名跨域(Spring Boot 2.4+替代allowedOrigins("*"))
                .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH") // 允許的請(qǐng)求方式
                .allowedHeaders("*") // 允許的請(qǐng)求頭
                .allowCredentials(true) // 允許攜帶Cookie
                .maxAge(3600); // 預(yù)檢請(qǐng)求有效期(秒),避免重復(fù)發(fā)送預(yù)檢請(qǐng)求
    }
    // 攔截器注冊(cè)...
}

方式 2:局部跨域配置(作用于單個(gè)接口 / 控制器)

@CrossOrigin注解,標(biāo)記在控制器 / 方法上:

// 控制器級(jí)別:該類(lèi)所有接口允許跨域
@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "*", maxAge = 3600)
public class UserController {
    // 方法級(jí)別:僅該接口允許跨域(覆蓋控制器級(jí)別配置)
    @GetMapping("/get/{id}")
    @CrossOrigin(origins = "http://localhost:3000")
    public String getUser(@PathVariable Long id) {
        return "{\"id\":" + id + ", \"name\":\"張三\"}";
    }
}

三、數(shù)據(jù)訪問(wèn)核心組件(操作數(shù)據(jù)庫(kù)必用)

Spring Boot 提供了多種數(shù)據(jù)訪問(wèn)組件,適配不同的數(shù)據(jù)庫(kù)操作框架,最常用的是 MyBatis-Plus(簡(jiǎn)化 MyBatis)Spring Data JPA(ORM 框架),以下講解基于MyBatis-Plus(企業(yè)開(kāi)發(fā)主流,比原生 MyBatis 少寫(xiě) 80% 代碼)。

1. 核心依賴(lài)(MyBatis-Plus + 數(shù)據(jù)庫(kù)驅(qū)動(dòng) + 連接池)

<!-- MyBatis-Plus Starter(整合MyBatis+自動(dòng)配置) -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.5</version> <!-- 最新穩(wěn)定版 -->
</dependency>
<!-- MySQL驅(qū)動(dòng)(適配MySQL8+,5.x需修改版本為5.1.49) -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- 阿里Druid連接池(高性能,推薦,替代默認(rèn)的HikariCP) -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.20</version>
</dependency>

2. 數(shù)據(jù)庫(kù)配置(application.yml)

配置數(shù)據(jù)庫(kù)連接、MyBatis-Plus、連接池參數(shù):

spring:
  # 數(shù)據(jù)庫(kù)連接配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource # 指定Druid連接池
    driver-class-name: com.mysql.cj.jdbc.Driver # MySQL8+驅(qū)動(dòng)類(lèi)
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
    username: root # 數(shù)據(jù)庫(kù)用戶(hù)名
    password: 123456 # 數(shù)據(jù)庫(kù)密碼
    # Druid連接池配置
    druid:
      initial-size: 5 # 初始連接數(shù)
      min-idle: 5 # 最小空閑連接數(shù)
      max-active: 20 # 最大活躍連接數(shù)
      max-wait: 60000 # 最大等待時(shí)間(ms)
# MyBatis-Plus配置
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml # Mapper.xml文件路徑(若用注解開(kāi)發(fā)可省略)
  type-aliases-package: com.example.demo.entity # 實(shí)體類(lèi)包名,簡(jiǎn)化XML中的類(lèi)名
  configuration:
    map-underscore-to-camel-case: true # 開(kāi)啟下劃線轉(zhuǎn)駝峰(數(shù)據(jù)庫(kù)user_name → 實(shí)體類(lèi)userName)
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 開(kāi)啟SQL日志,方便調(diào)試

3. 核心注解與使用(MyBatis-Plus)

(1)實(shí)體類(lèi)注解(@TableName/@TableId/@TableField)

標(biāo)記實(shí)體類(lèi)與數(shù)據(jù)庫(kù)表的映射關(guān)系:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
// 映射數(shù)據(jù)庫(kù)表:t_user(若實(shí)體類(lèi)名與表名一致,可省略)
@TableName("t_user")
public class User {
    // 主鍵注解,type = IdType.AUTO:自增主鍵
    @TableId(type = IdType.AUTO)
    private Long id;
    // 字段注解,若實(shí)體類(lèi)屬性與表字段名一致,可省略
    @TableField("user_name")
    private String userName;
    private Integer age;
    private String email;
    // getter/setter...
}

(2)Mapper 接口(繼承 BaseMapper,零 SQL 實(shí)現(xiàn) CRUD)

MyBatis-Plus 的核心,繼承BaseMapper<T>即可獲得單表 CRUD 所有方法,無(wú)需手動(dòng)編寫(xiě) Mapper 接口和 XML:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
// 標(biāo)記為MyBatis Mapper,Spring Boot自動(dòng)掃描并注冊(cè)
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 無(wú)需編寫(xiě)任何方法,BaseMapper已提供所有單表CRUD
    // 若需復(fù)雜查詢(xún),可手動(dòng)編寫(xiě)方法+XML/注解
}

(3)業(yè)務(wù)層使用(注入 Mapper,直接調(diào)用方法)

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    // 新增用戶(hù)
    public boolean addUser(User user) {
        return userMapper.insert(user) > 0;
    }
    // 根據(jù)ID查詢(xún)用戶(hù)
    public User getUserById(Long id) {
        return userMapper.selectById(id);
    }
    // 條件查詢(xún):根據(jù)姓名模糊查詢(xún),年齡大于20
    public List<User> listUser(String name) {
        // LambdaQueryWrapper:條件構(gòu)造器,鏈?zhǔn)骄幊蹋苊庥簿幋a字段名
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(User::getUserName, name) // 姓名模糊查詢(xún)
               .gt(User::getAge, 20); // 年齡大于20
        return userMapper.selectList(wrapper);
    }
    // 修改用戶(hù)
    public boolean updateUser(User user) {
        return userMapper.updateById(user) > 0;
    }
    // 刪除用戶(hù)
    public boolean deleteUser(Long id) {
        return userMapper.deleteById(id) > 0;
    }
}

4. 事務(wù)管理(@Transactional)

核心作用

保證多個(gè)數(shù)據(jù)庫(kù)操作的原子性(要么全部成功,要么全部失?。?,避免出現(xiàn)數(shù)據(jù)不一致(如轉(zhuǎn)賬時(shí)扣了 A 的錢(qián),沒(méi)加 B 的錢(qián))。

實(shí)戰(zhàn)使用

標(biāo)記在服務(wù)層方法上(必須在服務(wù)層,控制器層無(wú)效),Spring 會(huì)自動(dòng)為該方法添加事務(wù)支持:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    // 新增用戶(hù)并記錄日志,開(kāi)啟事務(wù)
    // rollbackFor = Exception.class:所有異常都回滾(默認(rèn)僅運(yùn)行時(shí)異常回滾)
    @Transactional(rollbackFor = Exception.class)
    public boolean addUserAndLog(User user) {
        // 操作1:新增用戶(hù)
        userMapper.insert(user);
        // 模擬異常:若出現(xiàn)異常,事務(wù)回滾,用戶(hù)不會(huì)被新增
        // int i = 1 / 0;
        // 操作2:記錄日志(假設(shè)有LogMapper)
        // logMapper.insert(new Log("新增用戶(hù):" + user.getUserName()));
        return true;
    }
}

核心屬性

  • rollbackFor = Exception.class:指定所有異常都回滾(默認(rèn)僅RuntimeExceptionError回滾,編譯時(shí)異常如IOException不回滾,建議必加);
  • propagation:事務(wù)傳播行為(如REQUIRED:默認(rèn),有事務(wù)則加入,無(wú)則新建;SUPPORTS:有事務(wù)則加入,無(wú)則無(wú)事務(wù));
  • readOnly = true:只讀事務(wù)(僅查詢(xún),提升性能)。

四、常用輔助組件(提升開(kāi)發(fā)效率)

1. 熱部署(spring-boot-starter-devtools)

核心作用

修改代碼 / 配置后,無(wú)需手動(dòng)重啟項(xiàng)目,自動(dòng)重啟 Spring Boot 應(yīng)用,提升開(kāi)發(fā)效率(僅開(kāi)發(fā)環(huán)境使用,生產(chǎn)環(huán)境禁用)。

依賴(lài)與配置

<!-- 熱部署依賴(lài) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

yml 配置(可選,優(yōu)化熱部署):

spring:
  devtools:
    restart:
      enabled: true # 開(kāi)啟熱部署
      additional-paths: src/main/java # 監(jiān)聽(tīng)的代碼目錄
      exclude: static/**,templates/** # 排除的目錄(靜態(tài)資源/視圖,修改后無(wú)需重啟)

IDEA 配置(必做,否則熱部署不生效):

  1. 開(kāi)啟自動(dòng)編譯:File → Settings → Build, Execution, Deployment → Compiler → 勾選Build project automatically;
  2. 開(kāi)啟高級(jí)自動(dòng)編譯:按住Ctrl+Alt+Shift+/ → 選擇 Registry → 勾選compiler.automake.allow.when.app.running

2. Lombok(簡(jiǎn)化代碼,消除樣板代碼)

核心作用

通過(guò)注解替代 Java 中繁瑣的getter/setter/toString/ 構(gòu)造方法,減少代碼量,提升開(kāi)發(fā)效率(需安裝 IDEA Lombok 插件)。

核心依賴(lài)與注解

<!-- Lombok依賴(lài) -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

常用注解(標(biāo)記在實(shí)體類(lèi)上):

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.ToString;
@TableName("t_user")
@Data // 自動(dòng)生成getter/setter/equals/hashCode/toString
@NoArgsConstructor // 自動(dòng)生成無(wú)參構(gòu)造方法
@AllArgsConstructor // 自動(dòng)生成全參構(gòu)造方法
// @ToString // 單獨(dú)生成toString(@Data已包含)
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String userName;
    private Integer age;
    private String email;
}

其他常用注解:

  • @Slf4j:自動(dòng)生成日志對(duì)象log,替代LoggerFactory.getLogger(類(lèi)名.class);
  • @Builder:開(kāi)啟建造者模式,可通過(guò)User.builder().id(1L).userName("張三").build()創(chuàng)建對(duì)象;
  • @NonNull:標(biāo)記字段為非空,賦值為 null 時(shí)拋出空指針異常。

3. 接口文檔(Knife4j,替代 Swagger)

核心作用

自動(dòng)生成RESTful 接口文檔,支持在線調(diào)試、接口測(cè)試、文檔導(dǎo)出,替代傳統(tǒng)的 Word 文檔,實(shí)現(xiàn)接口文檔與代碼同步更新(Swagger3 的增強(qiáng)版,更適配 Spring Boot 3+)。

核心依賴(lài)與配置

<!-- Knife4j Starter(整合Swagger3,適配Spring Boot 3+) -->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>4.4.0</version> <!-- 最新穩(wěn)定版 -->
</dependency>

配置類(lèi)(開(kāi)啟 Swagger3):

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
@Configuration
@EnableWebMvc
@EnableKnife4j // 開(kāi)啟Knife4j增強(qiáng)功能
public class Knife4jConfig {
    // 配置接口文檔基本信息
    @Bean
    public OpenAPI openAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("Spring Boot組件演示接口文檔")
                        .description("Spring Boot核心組件實(shí)戰(zhàn)接口")
                        .version("1.0.0"));
    }
}

yml 配置(開(kāi)發(fā)環(huán)境開(kāi)啟,生產(chǎn)環(huán)境關(guān)閉):

knife4j:
  enable: true # 開(kāi)啟Knife4j
  openapi:
    title: Spring Boot組件演示接口文檔
    description: 核心組件實(shí)戰(zhàn)接口
    version: 1.0.0
spring:
  profiles:
    active: dev # 開(kāi)發(fā)環(huán)境開(kāi)啟,生產(chǎn)環(huán)境改為prod并設(shè)置knife4j.enable=false

接口注解(標(biāo)記接口 / 參數(shù),生成更詳細(xì)的文檔)

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
    // 接口描述
    @Operation(summary = "根據(jù)ID查詢(xún)用戶(hù)", description = "傳入用戶(hù)ID,返回用戶(hù)詳細(xì)信息")
    // 參數(shù)描述
    @Parameters({@Parameter(name = "id", description = "用戶(hù)ID", required = true)})
    @GetMapping("/get/{id}")
    public User getUser(@PathVariable Long id) {
        return new User(id, "張三", 25, "zhangsan@163.com");
    }
}

訪問(wèn)文檔

項(xiàng)目啟動(dòng)后,訪問(wèn):http://localhost:8081/doc.html(替換為自己的端口 / 上下文路徑),即可看到接口文檔,支持在線調(diào)試(直接填寫(xiě)參數(shù),點(diǎn)擊 “發(fā)送” 即可測(cè)試接口)。

五、Spring Boot 組件核心配合邏輯(一張圖理解)

plaintext

┌─────────────────────────────────────────────────────────┐
│  客戶(hù)端請(qǐng)求(瀏覽器/前端/Postman)                        │
└───────────────────────────┬─────────────────────────────┘
                            │
┌───────────────────────────▼─────────────────────────────┐
│  服務(wù)器(Tomcat,由spring-boot-starter-web自動(dòng)嵌入)     │
└───────────────────────────┬─────────────────────────────┘
                            │
┌───────────────────────────▼─────────────────────────────┐
│  攔截器(Interceptor):登錄驗(yàn)證/日志記錄/限流            │
└───────────────────────────┬─────────────────────────────┘
                            │
┌───────────────────────────▼─────────────────────────────┐
│  控制器(@RestController):接收請(qǐng)求/參數(shù)綁定/返回響應(yīng)    │
└───────────────────────────┬─────────────────────────────┘
                            │
┌───────────────────────────▼─────────────────────────────┐
│  服務(wù)層(@Service):業(yè)務(wù)邏輯處理 + 事務(wù)管理(@Transactional)│
└───────────────────────────┬─────────────────────────────┘
                            │
┌───────────────────────────▼─────────────────────────────┐
│  數(shù)據(jù)訪問(wèn)層(@Mapper/MyBatis-Plus):操作數(shù)據(jù)庫(kù)          │
└───────────────────────────┬─────────────────────────────┘
                            │
┌───────────────────────────▼─────────────────────────────┐
│  數(shù)據(jù)庫(kù)(MySQL/Redis)                                   │
└─────────────────────────────────────────────────────────┘

全局組件兜底

  • 全局異常處理器(@RestControllerAdvice):捕獲所有環(huán)節(jié)的異常,返回統(tǒng)一 JSON;
  • 配置文件(application.yml):覆蓋所有組件的默認(rèn)配置;
  • Spring IOC 容器:管理所有 Bean,實(shí)現(xiàn)依賴(lài)注入和解耦。

六、總結(jié)(核心關(guān)鍵點(diǎn))

  1. Spring Boot 核心思想約定大于配置,通過(guò)Starter 起步依賴(lài)自動(dòng)配置消除繁瑣配置,專(zhuān)注業(yè)務(wù)開(kāi)發(fā);
  2. 基礎(chǔ)三件套:主啟動(dòng)類(lèi)(@SpringBootApplication)+ 配置文件(application.yml)+ 核心注解(Bean 注冊(cè) / 依賴(lài)注入),所有項(xiàng)目必用;
  3. Web 開(kāi)發(fā)核心:@RestController 實(shí)現(xiàn) RESTful 接口,@RestControllerAdvice 實(shí)現(xiàn)全局異常處理,Interceptor 實(shí)現(xiàn)請(qǐng)求攔截,CORS 解決跨域;
  4. 數(shù)據(jù)訪問(wèn)核心:MyBatis-Plus 簡(jiǎn)化數(shù)據(jù)庫(kù)操作,@Transactional 保證事務(wù)原子性,Druid 作為高性能連接池;
  5. 效率提升組件:Lombok 消除樣板代碼,devtools 實(shí)現(xiàn)熱部署,Knife4j 自動(dòng)生成接口文檔,都是企業(yè)開(kāi)發(fā)必備;
  6. 核心原則
    • 所有組件通過(guò)Starter引入,避免手動(dòng)管理依賴(lài);
    • 所有自定義 Bean 通過(guò) **@Configuration + @Bean** 聲明,或通過(guò) @Component 系列注解注冊(cè);
    • 所有依賴(lài)通過(guò) **@Autowired/@Resource** 注入,無(wú)需手動(dòng) new,實(shí)現(xiàn)解耦;
    • 開(kāi)發(fā)環(huán)境與生產(chǎn)環(huán)境通過(guò)多環(huán)境配置分離,避免配置混用。

以上就是 Spring Boot 最核心、最常用的組件使用詳解,覆蓋了從基礎(chǔ)項(xiàng)目搭建到后端接口開(kāi)發(fā)、數(shù)據(jù)庫(kù)操作、效率提升的全流程,所有代碼都可直接復(fù)制到 Spring Boot 3.2.x 項(xiàng)目中使用,適配企業(yè)開(kāi)發(fā)的主流場(chǎng)景。

到此這篇關(guān)于Spring Boot 3X 框架核心組件的使用詳解的文章就介紹到這了,更多相關(guān)Spring Boot 3X 框架使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解spring中的Aware接口功能

    詳解spring中的Aware接口功能

    Spring的依賴(lài)注入的最大亮點(diǎn)是所有的Bean對(duì)Spring容器的存在是沒(méi)有意識(shí)的,我們可以將Spring容器換成其他的容器,Spring容器中的Bean的耦合度因此也是極低的,本文重點(diǎn)給大家介紹spring中的Aware接口,感興趣的朋友一起看看吧
    2022-02-02
  • Springboot詳解RocketMQ實(shí)現(xiàn)廣播消息流程

    Springboot詳解RocketMQ實(shí)現(xiàn)廣播消息流程

    RocketMQ作為一款純java、分布式、隊(duì)列模型的開(kāi)源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時(shí)消息、消息回溯等,本篇我們了解如何實(shí)現(xiàn)廣播消息
    2022-06-06
  • java網(wǎng)上圖書(shū)商城(8)訂單模塊3

    java網(wǎng)上圖書(shū)商城(8)訂單模塊3

    這篇文章主要為大家詳細(xì)介紹了java網(wǎng)上圖書(shū)商城,訂單模塊第三篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 淺談Java字符串比較的三種方法

    淺談Java字符串比較的三種方法

    這篇文章主要介紹了淺談Java字符串比較的三種方法,字符串比較是常見(jiàn)的操作,包括比較相等、比較大小、比較前綴和后綴串等,需要的朋友可以參考下
    2023-04-04
  • Java超詳細(xì)講解ArrayList與順序表的用法

    Java超詳細(xì)講解ArrayList與順序表的用法

    ArrayList 類(lèi)是一個(gè)可以動(dòng)態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒(méi)有固定大小的限制,我們可以添加或刪除元素。ArrayList 繼承了 AbstractList ,并實(shí)現(xiàn)了 List 接口,順序表是將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示
    2022-06-06
  • 詳解Java設(shè)計(jì)模式之單例模式

    詳解Java設(shè)計(jì)模式之單例模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之單例模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 詳解Spring中的攔截器與過(guò)濾器

    詳解Spring中的攔截器與過(guò)濾器

    Filter?過(guò)濾器和Interceptor?攔截器是SpringBoot?的?Web?項(xiàng)目開(kāi)發(fā)中長(zhǎng)用到的,本文主要來(lái)和大家討論一下?Filter?與?Interceptor?的做法及它們之間的區(qū)別,需要的可以參考下
    2023-07-07
  • 深入了解Spring控制反轉(zhuǎn)IOC原理

    深入了解Spring控制反轉(zhuǎn)IOC原理

    IOC-Inversion?of?Control,即控制反轉(zhuǎn)。它不是什么技術(shù),而是一種設(shè)計(jì)思想。這篇文章將為大家介紹一下Spring控制反轉(zhuǎn)IOC的原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 淺析如何將多個(gè)SpringBoot項(xiàng)目打包到一個(gè)Docker容器中

    淺析如何將多個(gè)SpringBoot項(xiàng)目打包到一個(gè)Docker容器中

    在現(xiàn)代軟件開(kāi)發(fā)中,Docker已成為一種流行的容器化技術(shù),能夠簡(jiǎn)化應(yīng)用的部署和管理,本文將詳細(xì)介紹如何將多個(gè)Spring Boot項(xiàng)目打包到一個(gè)Docker容器中,希望對(duì)大家有所幫助
    2024-10-10
  • JAVA項(xiàng)目字典與緩存搭配使用方法解析

    JAVA項(xiàng)目字典與緩存搭配使用方法解析

    這篇文章主要介紹了JAVA項(xiàng)目字典與緩存搭配使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

德江县| 平原县| 肥城市| 都兰县| 白山市| 海兴县| 九龙城区| 满洲里市| 道真| 富平县| 永平县| 波密县| 溧水县| 星座| 梁河县| 钟祥市| 五寨县| 波密县| 仪征市| 华亭县| 惠州市| 鄂托克旗| 济阳县| 磴口县| 涟源市| 翼城县| 咸宁市| 酒泉市| 金沙县| 宜兰县| 青川县| 河间市| 庐江县| 崇左市| 称多县| 敖汉旗| 鹤岗市| 株洲县| 璧山县| 嘉荫县| 永定县|