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

Java中的@Repeatable注解使用詳解

 更新時(shí)間:2024年02月02日 08:58:41   作者:真正的大師學(xué)徒的心  
這篇文章主要介紹了Java中的@Repeatable注解使用詳解,@Repeatable注解是java8為了解決同一個(gè)注解不能重復(fù)在同一類(lèi)/方法/屬性上使用的問(wèn)題,本文提供了解決思路和部分實(shí)現(xiàn)代碼,需要的朋友可以參考下

@Repeatable

@Repeatable注解是java8為了解決同一個(gè)注解不能重復(fù)在同一類(lèi)/方法/屬性上使用的問(wèn)題。

@Repeatable是jdk8中新增的注解,使用如Spring中的@ComponentScan注解。

在沒(méi)有@Repeatable注解的的注解中,在同一個(gè)地方使用相同的注解會(huì)報(bào)錯(cuò),有了此元注解注解的注解,就可以在同一個(gè)地方使用相同的注解。

舉例說(shuō)明

舉一個(gè)比較貼近開(kāi)發(fā)的例子,在spring/springboot我們引入資源文件可以使用注解@PropertySource

@PropertySource("classpath:sso.properties")
public class Application {
}

那要引入多個(gè)資源文件怎么辦,沒(méi)事,我把PropertySource中的value設(shè)置成String[]數(shù)組就行了

public @interface PropertySource {
      ...
      String[] value();
}

那么就能這么用

@PropertySource({"classpath:sso.properties","classpath:dubbo.properties","classpath:systemInfo.properties"})
public class Application {
}

就spring引入配置文件來(lái)講,肯定是沒(méi)事問(wèn)題的。但是如果注解中2個(gè)值存在依賴(lài)關(guān)系,那么這樣就不行了。比如下面這個(gè)

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Validate {
    /**
     * 業(yè)務(wù)類(lèi)型
     * @return
     */
    String bizCode();

    /**
     * 訂單類(lèi)型
     * @return
     */
    int orderType();
}

上面的@validate注解,bizcode和orderType是一對(duì)一的關(guān)系,我希望可以添加如下的注解

@Validate(bizCode = "fruit",orderType = 1)
@Validate(bizCode = "fruit",orderType = 2)
@Validate(bizCode = "vegetable",orderType = 2)
public class BizLogic2 {
}

很抱歉在java8之前,這種方式不行,不過(guò)你可以這么做,新建一個(gè)如下的注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Validates {

    Validate[] value();

}

然后對(duì)應(yīng)代碼修改如下

@Validates(value = {
        @Validate(bizCode = "fruit",orderType = 1)
        @Validate(bizCode = "fruit",orderType = 2)
        @Validate(bizCode = "vegetable",orderType = 2)
})
public class BizLogic2 {
}

在java8的@Repeatable出來(lái)之后,我們?cè)诓桓膭?dòng)@Validates的情況下,對(duì)@Validate進(jìn)行修改,增加 @Repeatable(Validates.class)

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(Validates.class)
public @interface Validate {
    /**
     * 業(yè)務(wù)類(lèi)型
     * @return
     */
    String bizCode();
    /**
     * 訂單類(lèi)型
     * @return
     */
    int orderType();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Validates {

    Validate[] value();

}

注意,一旦使用Repeatable注解指定了注解Validates,那么這個(gè)聚合注解默認(rèn)約束value來(lái)存儲(chǔ)子注解,用其他的名字代替value均會(huì)編譯報(bào)錯(cuò)

那么就可以在類(lèi)上使用多個(gè)@Validate注解了。

@Validate(bizCode = "fruit",orderType = 1)
@Validate(bizCode = "fruit",orderType = 2)
@Validate(bizCode = "vegetable",orderType = 2)
public class BizLogic2 {
}

還有一點(diǎn)需要注意,我的@Validate是被@Component元注解標(biāo)注,當(dāng)多個(gè)@Validate語(yǔ)法糖轉(zhuǎn)換成@Validates之后,由于@Validates上沒(méi)@Component,導(dǎo)致我的bean加載不到spring容器中去

@Repeatable 原理

那么@Repeatable的原理是啥? 其實(shí)就是語(yǔ)法糖

對(duì)于下面的注解

@Repeatable(Persons.class)
public @interface Person {
    String role() default "";
    String name() default "";
}
public @interface Persons {
    Person[] value();
}

我們給下面這個(gè)類(lèi)加上注解,重點(diǎn)關(guān)注這個(gè)類(lèi),打開(kāi)這個(gè)編譯后的類(lèi)(即這個(gè)java文件對(duì)應(yīng)的class文件)

@Person(role = "警察",name = "小花")
@Person(role = "小偷",name = "笑話(huà)")
public class AnnotationTest {
}

我們得到下面的代碼

@Persons({@Person(
    role = "警察",
    name = "小花"
), @Person(
    role = "小偷",
    name = "笑話(huà)"
)})
public class AnnotationTest {
    public AnnotationTest() {
    }
}

從這里可以看出的確就是語(yǔ)法糖。

問(wèn)題來(lái)了 我們打開(kāi)下面這個(gè)編譯后的類(lèi)

@Person(role = "警察",name = "小花")
public class AnnotationTest {
}

得到的結(jié)果是這樣

@Person(
    role = "警察",
    name = "小花"
)
public class AnnotationTest {
    public AnnotationTest() {
    }
}

那這樣就存在問(wèn)題了,我以為加了@Repeatable之后@Validate都會(huì)生成被語(yǔ)法糖@Validates包裹。

沒(méi)想到它居然這么智能,只有一個(gè)@Validate注解的時(shí)候居然不轉(zhuǎn)換。

所以使用多個(gè)@Validate的時(shí)候就會(huì)留坑,你需要兼容1個(gè)或多個(gè)的場(chǎng)景。

到此這篇關(guān)于Java中的@Repeatable注解使用詳解的文章就介紹到這了,更多相關(guān)@Repeatable注解使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)可配置換膚的方法示例

    Java實(shí)現(xiàn)可配置換膚的方法示例

    本文主要介紹了Java實(shí)現(xiàn)可配置換膚的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java一致性Hash算法的實(shí)現(xiàn)詳解

    Java一致性Hash算法的實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java一致性Hash算法的實(shí)現(xiàn)詳解,hash的意思是散列,目的將一組輸入的數(shù)據(jù)均勻的分開(kāi)、打散,往往用來(lái)配合路由算法做負(fù)載均衡,多用在分布式系統(tǒng)中,需要的朋友可以參考下
    2024-01-01
  • springboot集成JWT之雙重token的實(shí)現(xiàn)

    springboot集成JWT之雙重token的實(shí)現(xiàn)

    本文主要介紹了springboot集成JWT之雙重token的實(shí)現(xiàn),前端使用accessToken進(jìn)行登錄和驗(yàn)證,后端使用refreshToken定期更新accessToken,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Java獲取客戶(hù)端真實(shí)IP地址經(jīng)典寫(xiě)法與Lambda寫(xiě)法對(duì)比示例代碼

    Java獲取客戶(hù)端真實(shí)IP地址經(jīng)典寫(xiě)法與Lambda寫(xiě)法對(duì)比示例代碼

    在網(wǎng)絡(luò)編程中,獲取客戶(hù)端的IP地址和端口地址是非常常見(jiàn)的需求,這篇文章主要介紹了Java獲取客戶(hù)端真實(shí)IP地址經(jīng)典寫(xiě)法與Lambda寫(xiě)法對(duì)比的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-05-05
  • 吊打Java面試官之Lambda表達(dá)式 Stream API

    吊打Java面試官之Lambda表達(dá)式 Stream API

    這篇文章主要介紹了吊打Java之jdk8的新特性包括Lambda表達(dá)式、函數(shù)式接口、Stream API全面刨析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 快速解決commons-fileupload組件無(wú)法處理自定義head信息的bug

    快速解決commons-fileupload組件無(wú)法處理自定義head信息的bug

    問(wèn)題在于fileupload組件解析完自定義的head節(jié)點(diǎn)后,卻忘記傳遞到FileItemStreamImpl中了,稍作修訂,即可修正該bug
    2013-08-08
  • springboot配置logback日志管理過(guò)程詳解

    springboot配置logback日志管理過(guò)程詳解

    這篇文章主要介紹了springboot配置logback日志管理過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • java求100以?xún)?nèi)的素?cái)?shù)示例分享

    java求100以?xún)?nèi)的素?cái)?shù)示例分享

    素?cái)?shù)是指因數(shù)只有1和本身的數(shù)字,這篇文章主要介紹了java求100以?xún)?nèi)的素?cái)?shù)示例,需要的朋友可以參考下
    2014-03-03
  • 深入學(xué)習(xí)java枚舉的應(yīng)用

    深入學(xué)習(xí)java枚舉的應(yīng)用

    本篇是關(guān)于java深入提高學(xué)習(xí)的相關(guān)知識(shí),介紹了枚舉的應(yīng)用等方面內(nèi)容,有興趣的朋友參考學(xué)習(xí)下吧。
    2018-01-01
  • Java實(shí)現(xiàn)兩人五子棋游戲(二) 畫(huà)出棋盤(pán)

    Java實(shí)現(xiàn)兩人五子棋游戲(二) 畫(huà)出棋盤(pán)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,畫(huà)出五子棋的棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評(píng)論

绥宁县| 余江县| 无为县| 佛学| 古蔺县| 如东县| 大荔县| 太仆寺旗| 斗六市| 炎陵县| 同德县| 苍山县| 远安县| 沐川县| 禄丰县| 和林格尔县| 丰都县| 云龙县| 泸定县| 蒙山县| 栖霞市| 章丘市| 长垣县| 乌兰浩特市| 诸城市| 尉氏县| 颍上县| 杭锦旗| 改则县| 株洲县| 双辽市| 绥宁县| 承德市| 东源县| 乌兰县| 石楼县| 寿光市| 宝兴县| 威宁| 寿宁县| 康定县|