欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot Starter 封裝的實(shí)現(xiàn)示例

 更新時(shí)間:2025年09月15日 09:19:49   作者:lihainuo  
Spring Boot Starter封裝了項(xiàng)目中常用的一些依賴,使得開發(fā)者可以快速啟動(dòng)和運(yùn)行項(xiàng)目,而無需手動(dòng)配置這些依賴,下面就來詳細(xì)的介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下

一、為什么要封裝Starter?

在企業(yè)級(jí)開發(fā)中,我們經(jīng)常需要將通用能力(如鑒權(quán)、日志、分布式鎖等)抽象為可復(fù)用的組件。Spring Boot Starter 的封裝能帶來三大核心優(yōu)勢(shì):

  1. ?配置統(tǒng)一管理? - 通過 application.properties 實(shí)現(xiàn)“開箱即用”,避免重復(fù)配置
  2. ?依賴自動(dòng)裝配? - 按需加載Bean,解決傳統(tǒng)組件依賴復(fù)雜的問題
  3. ?版本統(tǒng)一控制? - 在父POM中管理依賴版本,規(guī)避兼容性風(fēng)險(xiǎn)

?舉個(gè)實(shí)際痛點(diǎn)?:
傳統(tǒng)JWT工具類需要每個(gè)項(xiàng)目手動(dòng)配置密鑰、過期時(shí)間等參數(shù),而通過Starter封裝后,只需引入依賴即可直接注入預(yù)配置的Bean。

二、手把手實(shí)現(xiàn)JWT Starter

1. 創(chuàng)建模塊 & 初始化依賴

按Spring官方規(guī)范命名模塊:jwt-spring-boot-starter

<!-- 核心依賴 -->
<dependencies>
    <!-- JJWT 相關(guān) -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-api</artifactId>
        <version>0.11.5</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-impl</artifactId>
        <version>0.11.5</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-jackson</artifactId>
        <version>0.11.5</version>
        <scope>runtime</scope>
    </dependency>
    
    <!-- 配置元數(shù)據(jù)生成 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

2. 創(chuàng)建配置文件 & Properties類

創(chuàng)建 resources/config/jwt-default.properties
此文件用于在Starter導(dǎo)入其他模塊下,其他模塊下沒有配置jwt屬性時(shí),使用Starter內(nèi)部的配置文件屬性。

jwt.key=default_secret_key
jwt.access_token_ttl=300000
jwt.refresh_token_ttl=604800000

創(chuàng)建 JwtProperties 類:

// main/java/.../config
@Data
@Configuration
@ConfigurationProperties(prefix = "jwt")
public class JwtProperties {
    private String key;
    private long accessTokenTtl;
    private long refreshTokenTtl;
}

3. 實(shí)現(xiàn)自動(dòng)配置類

@Configuration
@EnableConfigurationProperties(JwtProperties.class)
@PropertySource("classpath:/config/jwt-default.properties")
@ConditionalOnClass(Jwts.class) // 當(dāng)JJWT存在時(shí)生效
@ConditionalOnProperty(prefix = "jwt", name = "enabled", matchIfMissing = true)
public class JwtAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean // 用戶未自定義時(shí)生效
    public JwtUtil jwtUtil(JwtProperties properties) {
        return new JwtUtil(properties);
    }
}

4. 編寫JWT核心工具類

public class JwtUtil {
    private final JwtProperties properties;

    public JwtUtil(JwtProperties properties) {
        this.properties = properties;
    }

    // 生成AccessToken(示例代碼)
    public String createAccessToken(ClaimDTO claims) {
        return Jwts.builder()
                .setClaims(convertToMap(claims))
                .setExpiration(new Date(System.currentTimeMillis() + properties.getAccessTokenTtl()))
                .signWith(Keys.hmacShaKeyFor(properties.getKey().getBytes()))
                .compact();
    }

    // Token校驗(yàn)(返回枚舉更規(guī)范)
    public TokenStatus validateToken(String token) {
        try {
            parseToken(token);
            return TokenStatus.VALID;
        } catch (ExpiredJwtException e) {
            return TokenStatus.EXPIRED;
        } 
        // ... 其他異常處理
    }
}

5. 注冊(cè)自動(dòng)配置

在 resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中寫入:

com.example.jwt.config.JwtAutoConfiguration

注意: 此注冊(cè)自動(dòng)配置為Spring Boot 3.x 版本。

三、在項(xiàng)目中集成Starter

1. 引入依賴

<dependency>
    <groupId>com.example</groupId>
    <artifactId>jwt-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

2. 自定義配置(可選)

在 application.yml 中覆蓋默認(rèn)值:

jwt:
  key: your_secure_key_here
  access-token-ttl: 3600000 # 1小時(shí)

3. 直接注入使用

@RestController
public class AuthController {

    private final JwtUtil jwtUtil;

    // 構(gòu)造器注入
    public AuthController(JwtUtil jwtUtil) {
        this.jwtUtil = jwtUtil;
    }

    @PostMapping("/login")
    public String login(@RequestBody User user) {
        // ... 驗(yàn)證邏輯
        return jwtUtil.createAccessToken(user);
    }
}

4. 注意事項(xiàng)

小nuo發(fā)現(xiàn),對(duì)于Starter導(dǎo)入其他模塊時(shí),其他模塊下的配置文件沒有配置Starter所需的配置時(shí),Starter的默認(rèn)配置丟失,解決方案:

jwtProperties 類中直接設(shè)置默認(rèn)值

@ConfigurationProperties(prefix = "jwt")
public class JwtProperties {
    // 直接設(shè)置字段默認(rèn)值
    private String secretKey = "default-secret";
    private long expiration = 3600L; 
}

使用 @PropertySource 從而確保使用Starter內(nèi)部配置文件 因?yàn)?strong>Spring Boot配置加載優(yōu)先級(jí)的原因:

Spring Boot的配置加載遵循特定優(yōu)先級(jí),后加載的配置會(huì)覆蓋先加載的。
如果其他模塊的配置文件中定義了同名屬性,會(huì)覆蓋Starter的默認(rèn)配置。
若模塊未顯式配置屬性,但Starter的默認(rèn)值未生效,需檢查Starter的默認(rèn)值設(shè)置方式:
出現(xiàn)此問題就需要使用到 @PropertySource 注解,就如上示例使用方法一致。

四、配置加載優(yōu)先級(jí)解密

當(dāng)自定義配置與Starter默認(rèn)配置沖突時(shí),Spring Boot按以下優(yōu)先級(jí)處理(從高到低):

  1. ?命令行參數(shù)?
    java -jar app.jar --jwt.key=cli_key
  2. ?應(yīng)用配置文件?
    application.properties > application.yml
  3. ?Starter默認(rèn)配置?
    jwt-default.properties
  4. ?代碼默認(rèn)值?
    JwtProperties 類中的字段初始值

五、封裝經(jīng)驗(yàn)總結(jié)

  1. ?避免過度設(shè)計(jì)?
    首版只需實(shí)現(xiàn)核心功能,迭代中逐步添加如Redis令牌黑名單等高級(jí)特性

  2. ?防御性編程?

    • 對(duì)密鑰進(jìn)行非空校驗(yàn):Assert.hasText(properties.getKey(), "JWT密鑰不能為空")
    • Token解析增加空值判斷

現(xiàn)在已經(jīng)可以舉一反三學(xué)會(huì)封裝其他的啦!

六、踩坑警示錄

?典型問題1?:Bean注入沖突
?? ?現(xiàn)象?:?jiǎn)?dòng)報(bào) No qualifying bean of type 'JwtUtil'
? ?解決方案?:檢查是否誤加了 @Component 注解,應(yīng)通過自動(dòng)配置類創(chuàng)建Bean

?典型問題2?:配置未生效
?? ?現(xiàn)象?:修改 application.yml 后仍使用默認(rèn)值
? ?排查步驟?:

  1. 檢查配置項(xiàng)命名是否符合kebab-case(如access-token-ttl
  2. 確認(rèn)配置路徑是否被更高優(yōu)先級(jí)的源覆蓋

?討論話題?:你在封裝Starter時(shí)遇到過哪些棘手問題?歡迎在評(píng)論區(qū)分享經(jīng)驗(yàn)給小nuo!

到此這篇關(guān)于Spring Boot Starter 封裝的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Spring Boot Starter 封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot 接收POST、json、文本數(shù)據(jù)的方法 附示例

    Springboot 接收POST、json、文本數(shù)據(jù)的方法 附示例

    這篇文章主要介紹了Springboot 接收POST、json、文本數(shù)據(jù)實(shí)踐,如果把 json 作為參數(shù)傳遞,我們可以使用 @requestbody 接收參數(shù),將數(shù)據(jù)直接轉(zhuǎn)換成對(duì)象,本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 詳解jvm對(duì)象的創(chuàng)建和分配

    詳解jvm對(duì)象的創(chuàng)建和分配

    這篇文章主要介紹了jvm對(duì)象的創(chuàng)建和分配的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • java在網(wǎng)頁上面抓取郵件地址的方法

    java在網(wǎng)頁上面抓取郵件地址的方法

    這篇文章主要介紹了java在網(wǎng)頁上面抓取郵件地址的方法,是比較典型的Java正則匹配應(yīng)用實(shí)例,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • java對(duì)象轉(zhuǎn)型實(shí)例分析

    java對(duì)象轉(zhuǎn)型實(shí)例分析

    這篇文章主要介紹了java對(duì)象轉(zhuǎn)型的概念及用法,并以實(shí)例形式進(jìn)行了較為詳細(xì)的介紹,需要的朋友可以參考下
    2014-10-10
  • Gradle快速安裝及入門

    Gradle快速安裝及入門

    今天小編就為大家分享一篇關(guān)于Gradle快速安裝及入門,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Mybatisplus更新某個(gè)字段為null問題

    Mybatisplus更新某個(gè)字段為null問題

    Mybatisplus更新某個(gè)字段為null時(shí),可以使用@TableField(updateStrategy=FieldStrategy.IGNORED)注解,該注解提供了字段映射、忽略非表字段、自動(dòng)填充策略、字段條件處理等功能
    2025-02-02
  • 詳解Spring Bean 之間的特殊關(guān)系

    詳解Spring Bean 之間的特殊關(guān)系

    在 Spring 容器中,兩個(gè) Bean 之間除了通過 <ref> 建立依賴關(guān)系外,還存在著一些特殊關(guān)系。這篇文章給大家想想介紹了Spring Bean 之間的特殊關(guān)系,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2018-05-05
  • 微信公眾號(hào)支付(一)如何獲取用戶openId

    微信公眾號(hào)支付(一)如何獲取用戶openId

    本篇文章給大家介紹微信公眾號(hào)支付如何獲取用戶openid,需要授權(quán)回調(diào)頁面域名等一系列途徑實(shí)現(xiàn)此功能,需要的朋友可以參考下
    2015-09-09
  • 淺談Java的SPI技術(shù)

    淺談Java的SPI技術(shù)

    這篇文章主要介紹了Java的SPI技術(shù)的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • MyBatis中使用foreach循環(huán)的坑及解決

    MyBatis中使用foreach循環(huán)的坑及解決

    這篇文章主要介紹了MyBatis中使用foreach循環(huán)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論