成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

逆天提升開發效率!Spring Boot 五個冷門注解實戰解析,99% 開發者忽略了

開發 前端
在日常開發中,我們經常使用如?@Component、@Autowired、@RestController?等注解。然而,Spring Boot 體系中其實還藏著一些不常用但非常強大的注解。今天我們就來系統解析 5 個容易被忽略的注解及其實際用法,每一個都能顯著提升開發靈活性和效率。

在日常開發中,我們經常使用如 @Component、@Autowired、@RestController 等注解。然而,Spring Boot 體系中其實還藏著一些不常用但非常強大的注解。今天我們就來系統解析 5 個容易被忽略的注解及其實際用法,每一個都能顯著提升開發靈活性和效率。

@Lookup:優雅地在單例中獲取原型 Bean

作用簡介:@Lookup 只能作用于方法,Spring 會在運行時為該方法生成代理邏輯,從容器中查找對應的 Bean 實例。這是獲取原型作用域 Bean 的最佳方式之一。

使用示例:

定義一個原型作用域的 Bean:

@Component
@Scope("prototype")
public class PrototypeBean{}

定義一個抽象類,并使用 @Lookup 指定方法:

@Component
public abstract class BusinessBean {
    @Lookup
    public abstract PrototypeBean getInstance();
}

通過一個 Runner 類測試每次獲取是否是新實例:

@Component
public class LookupRunner implements CommandLineRunner {
    private final BusinessBean businessBean;


    public LookupRunner(BusinessBean businessBean) {
        this.businessBean = businessBean;
    }


    @Override
    public void run(String... args) {
        System.out.println(businessBean.getInstance());
        System.out.println(businessBean.getInstance());
        System.out.println(businessBean.getInstance());
    }
}

運行效果:你會看到每次打印出來的實例地址都不同,說明 Spring 使用 @Lookup 成功地從容器中動態獲取了新的原型對象。

@DeclareParents:動態為類擴展接口能力

作用簡介:通過 AOP 的方式,讓某些類在運行時“具備”某個接口的實現,等同于給類動態添加了“父類”。

實戰示例:

首先定義一個接口及其默認實現:

public interface DAO {
    void query();
}


public class CommonDAO implements DAO {
    public void query() {
        System.out.println("執行通用查詢...");
    }
}

然后是一個原始類:

@Component
public class UserDAO{}

再定義切面,通過 @DeclareParents 增強功能:

@Aspect
@Component
public class DeclareParentsAspect {
    @DeclareParents(
        value = "com.pack.common_use.annotation.UserDAO",
        defaultImpl = CommonDAO.class
    )
    private DAO dao;
}

進行功能驗證:

@Component
public class DeclareParentsRunner implements CommandLineRunner {
    private final UserDAO userDAO;


    public DeclareParentsRunner(UserDAO userDAO) {
        this.userDAO = userDAO;
    }


    @Override
    public void run(String... args) {
        if (userDAO instanceof DAO dao) {
            dao.query(); // 輸出“執行通用查詢...”
        }
    }
}

優勢:無需修改原始類代碼即可為其添加新接口行為,非常適合做系統擴展或橫切邏輯增強。

@Timed 與 @Counted:輕松集成指標監控(Micrometer)

作用簡介:這兩個注解用于打點監控,可統計接口執行時長和調用次數,借助 Micrometer 和 Spring Boot Actuator 可實現自動監控接入。

準備工作:

引入依賴:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置開啟注解驅動:

management:
  observations:
    annotations:
      enabled: true

示例接口:

@RestController
@RequestMapping("/tcs")
public class TimedCountedAController {


    @Timed(
        value = "exec_time",
        description = "統計執行時間",
        histogram = true,
        extraTags = {"pack", "time"}
    )
    @GetMapping("/time")
    public ResponseEntity<?> time() throws Exception {
        TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));
        return ResponseEntity.ok("success");
    }


    @Counted(
        value = "exec_count",
        description = "統計執行次數",
        extraTags = {"pack", "count"}
    )
    @GetMapping("/count")
    public ResponseEntity<?> count() {
        return ResponseEntity.ok("success");
    }
}

然后通過 /actuator/metrics/exec_time 和 /actuator/metrics/exec_count 查看對應的指標數據。

亮點:無侵入方式實現接口級監控,適合所有服務治理體系。

@ConfigurationPropertiesBinding:為復雜配置提供自定義轉換支持

應用場景:當你的配置屬性不是簡單類型(比如需要將字符串轉換為對象),Spring 默認的綁定邏輯就會失效。這個注解可以注冊自定義類型轉換器。

問題復現:

配置文件如下:

pack:
  common:
    author: icoderoad
    app: Spring Boot3 實戰案例30講,2.0.0

對應 Java Bean:

@Component
@ConfigurationProperties(prefix = "pack.common")
public class CommonProperties {
    private String author;
    private App app;
    // getters & setters
}

由于 app 是自定義類型,而配置文件里是字符串,這會報類型轉換錯誤。

解決方案:自定義轉換器

@Component
@ConfigurationPropertiesBinding
public class AppConverter implements Converter<String, App> {
    @Override
    public App convert(String source) {
        if (source == null) return null;
        String[] parts = source.split(",");
        if (parts.length < 2) return null;
        return new App(parts[0], parts[1]);
    }
}

此處使用了 @ConfigurationPropertiesBinding 標注,Spring 在做屬性綁定時會自動使用該轉換器。

總結

這 5 個注解雖然不常見,但卻在很多特殊場景中有著獨特的價值:

注解名

作用簡述

@Lookup

單例 Bean 中注入原型 Bean 的推薦方式

@DeclareParents

為類動態擴展接口功能,AOP 編程利器

@Timed


@Counted


接口級別的調用時間、次數指標收集,Micrometer 集成關鍵

@ConfigurationPropertiesBinding

支持自定義配置項轉換邏輯的綁定器注解

掌握這些注解,能讓你在 Spring Boot 開發中如虎添翼,高效且優雅地應對復雜業務場景!

責任編輯:武曉燕 來源: 路條編程
相關推薦

2020-10-22 15:05:43

開發者技能工具

2025-06-11 02:00:00

Spring內置開發

2025-02-08 10:02:03

2019-04-02 15:20:18

JavaSpring注解

2025-04-08 02:22:22

SpringJackson注解

2024-02-28 08:15:38

DevSecOps開發者工具

2017-04-10 09:07:47

開發者開發代碼

2023-09-28 21:39:26

HutoolJava工具包

2011-03-30 08:49:34

WebjQuery

2012-03-07 09:41:01

Java

2021-10-21 08:00:00

開發技能技術

2017-08-02 14:44:06

Spring Boot開發注解

2021-11-19 17:01:49

Flutter谷歌Chrome OS

2024-01-03 18:01:48

Code技巧開發

2013-09-10 09:35:53

移動開發者全能開發者技能

2023-06-30 08:36:59

AI工具TodoChat

2011-12-27 09:31:13

程序員

2025-01-26 10:49:52

2023-12-04 17:12:34

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91.com在线观看 | 久久久性色精品国产免费观看 | 日韩精品专区在线影院重磅 | 777777777亚洲妇女 | 欧洲一级毛片 | av电影一区二区 | 亚洲人成网站777色婷婷 | 91国在线视频 | 欧美性高潮 | 亚洲免费在线观看视频 | 国产剧情一区二区三区 | 亚洲在线一区二区 | 国产一区二区精华 | 亚洲一区视频在线 | 日韩成人精品在线 | 一级网站 | 一区二区三区四区在线视频 | 久久久久免费精品国产小说色大师 | 国产高清av免费观看 | h片在线免费看 | 一区二区精品 | 99色视频 | 久久国产精品-国产精品 | 国产欧美一区二区三区在线看 | 亚洲天堂久久新 | 久久婷婷国产 | 性色在线 | 国产999精品久久久 午夜天堂精品久久久久 | 噜噜噜噜狠狠狠7777视频 | 日韩欧美不卡 | 色婷婷一区二区三区四区 | 成年人黄色一级片 | 国产精品视频在线观看 | 国产在线精品一区二区三区 | 精品久久影院 | 婷婷毛片 | 欧美日韩国产三级 | 在线免费视频一区 | 亚洲女人天堂成人av在线 | 久久精品网 | 日日av|