偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

@Lookup:優(yōu)雅地在單例中獲取原型 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 成功地從容器中動態(tài)獲取了新的原型對象。

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

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

實戰(zhà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 增強功能:

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

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

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

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

準備工作:

引入依賴:

<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 = "統(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 查看對應的指標數(shù)據(jù)。

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

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

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

問題復現(xiàn):

配置文件如下:

pack:
  common:
    author: icoderoad
    app: Spring Boot3 實戰(zhàn)案例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

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

@Timed


@Counted


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

@ConfigurationPropertiesBinding

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

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

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

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ā)技能技術

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技術棧公眾號