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

逆天提升開發(fā)效率!Spring Boot 五個冷門注解實戰(zhàn)解析,99% 開發(fā)者忽略了

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

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

@Lookup:優(yōu)雅地在單例中獲取原型 Bean

作用簡介:@Lookup 只能作用于方法,Spring 會在運行時為該方法生成代理邏輯,從容器中查找對應(yīng)的 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 成功地從容器中動態(tài)獲取了新的原型對象。

@DeclareParents:動態(tài)為類擴(kuò)展接口能力

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

實戰(zhàn)示例:

首先定義一個接口及其默認(rèn)實現(xiàn):

public interface DAO {
    void query();
}


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

然后是一個原始類:

@Component
public class UserDAO{}

再定義切面,通過 @DeclareParents 增強(qiáng)功能:

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

進(jìn)行功能驗證:

@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(); // 輸出“執(zhí)行通用查詢...”
        }
    }
}

優(yōu)勢:無需修改原始類代碼即可為其添加新接口行為,非常適合做系統(tǒng)擴(kuò)展或橫切邏輯增強(qiáng)。

@Timed 與 @Counted:輕松集成指標(biāo)監(jiān)控(Micrometer)

作用簡介:這兩個注解用于打點監(jiān)控,可統(tǒng)計接口執(zhí)行時長和調(diào)用次數(shù),借助 Micrometer 和 Spring Boot Actuator 可實現(xiàn)自動監(jiān)控接入。

準(zhǔn)備工作:

引入依賴:

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

配置開啟注解驅(qū)動:

management:
  observations:
    annotations:
      enabled: true

示例接口:

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


    @Timed(
        value = "exec_time",
        description = "統(tǒng)計執(zhí)行時間",
        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 = "統(tǒng)計執(zhí)行次數(shù)",
        extraTags = {"pack", "count"}
    )
    @GetMapping("/count")
    public ResponseEntity<?> count() {
        return ResponseEntity.ok("success");
    }
}

然后通過 /actuator/metrics/exec_time 和 /actuator/metrics/exec_count 查看對應(yīng)的指標(biāo)數(shù)據(jù)。

亮點:無侵入方式實現(xiàn)接口級監(jiān)控,適合所有服務(wù)治理體系。

@ConfigurationPropertiesBinding:為復(fù)雜配置提供自定義轉(zhuǎn)換支持

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

問題復(fù)現(xiàn):

配置文件如下:

pack:
  common:
    author: icoderoad
    app: Spring Boot3 實戰(zhàn)案例30講,2.0.0

對應(yīng) Java Bean:

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

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

解決方案:自定義轉(zhuǎn)換器

@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 標(biāo)注,Spring 在做屬性綁定時會自動使用該轉(zhuǎn)換器。

總結(jié)

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

注解名

作用簡述

@Lookup

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

@DeclareParents

為類動態(tài)擴(kuò)展接口功能,AOP 編程利器

@Timed


@Counted


接口級別的調(diào)用時間、次數(shù)指標(biāo)收集,Micrometer 集成關(guān)鍵

@ConfigurationPropertiesBinding

支持自定義配置項轉(zhuǎn)換邏輯的綁定器注解

掌握這些注解,能讓你在 Spring Boot 開發(fā)中如虎添翼,高效且優(yōu)雅地應(yīng)對復(fù)雜業(yè)務(wù)場景!

責(zé)任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2020-10-22 15:05:43

開發(fā)者技能工具

2025-06-11 02:00:00

Spring內(nèi)置開發(fā)

2025-02-08 10:02:03

2019-04-02 15:20:18

JavaSpring注解

2024-02-28 08:15:38

DevSecOps開發(fā)者工具

2017-04-10 09:07:47

開發(fā)者開發(fā)代碼

2023-09-28 21:39:26

HutoolJava工具包

2025-04-08 02:22:22

SpringJackson注解

2012-03-07 09:41:01

Java

2021-10-21 08:00:00

開發(fā)技能技術(shù)

2011-03-30 08:49:34

WebjQuery

2021-11-19 17:01:49

Flutter谷歌Chrome OS

2017-08-02 14:44:06

Spring Boot開發(fā)注解

2024-01-03 18:01:48

Code技巧開發(fā)

2013-09-10 09:35:53

移動開發(fā)者全能開發(fā)者技能

2023-06-30 08:36:59

AI工具TodoChat

2023-12-04 17:12:34

2011-12-27 09:31:13

程序員

2013-07-15 14:08:10

開發(fā)者技能
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 九九色综合 | 欧美成人一区二区三区片免费 | 亚洲成人在线视频播放 | 久久久久久综合 | 日本一区二区在线视频 | 亚州成人 | 成人天堂噜噜噜 | 欧美精品一区二区三区在线 | 国产精品1 | 久久一热 | 卡通动漫第一页 | 国产精品18hdxxxⅹ在线 | 国产我和子的乱视频网站 | 成人国产精品久久久 | 亚洲第一在线 | 中文字幕亚洲区 | 久久久噜噜噜久久中文字幕色伊伊 | 天天操夜夜操免费视频 | 久久久亚洲一区 | 免费久久视频 | 麻豆国产一区二区三区四区 | 国产精品久久久久久久久久久久 | www.久久久 | 午夜激情在线 | 天天干天天干 | 国产精品夜夜夜一区二区三区尤 | 国产精品毛片无码 | 欧美日韩在线观看一区 | 日韩欧美在线观看一区 | 成人一区二区三区 | 男人的天堂亚洲 | 亚洲高清视频在线观看 | 一区二区视频免费观看 | 国产精品区二区三区日本 | 亚洲毛片网站 | 欧美精品一区二区三区视频 | 国产精品1 | 亚洲精品一区中文字幕 | 欧美在线视频一区二区 | 亚洲欧洲成人在线 | 中文字幕亚洲欧美 |