java註解通俗易懂系列教程四之組合自定義註解

自定義註解初步會了之後,有時候會遇到1.註解只有一個屬性,想增加屬性。2.兩個註解經常一起使用,合併兩個註解爲一個,寫一個就行了省事。等等場景。

主要邏輯是:新定義一個註解,然後把原來的註解引入進來,新註解的屬性和原來註解的屬性綁定

1.組合多個註解到成爲一個新註解:a,b註解合併成c註解,c擁有a,b的全部或者部分屬性。以@SpringBootApplication爲例

組合邏輯:@SpringBootApplication組合@ComponentScanbasePackages和basePackageClasses@EnableAutoConfigurationexclude和excludeName

(1)需要在新註解@SpringBootApplication先加上想引入的註解@EnableAutoConfiguration

(2)其中使用註解@AliasFor來確定原來註解的屬性和新註解屬性的對應關係

@AliasFor的annotation指定引入註解是哪個,如果原來的註解屬性和新註解的屬性一致會自動匹配,如果原來的註解和新註解屬性名不一致需要使用attribute指定原來註解的屬性名是什麼。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM,
				classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {


	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};


	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};


	@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanBasePackages() default {};


	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class<?>[] scanBasePackageClasses() default {};

}

2.原來註解沒默認值,必須指定的情況需要注意

現在想用shiro的@RequiresPermissions註解新生成一個@ShiroRequiresPermissions註解

(1)原來的註解@RequiresPermissions 內容

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {


    String[] value();

    Logical logical() default Logical.AND; 

}

(2)新註解@ShiroRequiresPermissions

引入原來的註解@RequiresPermissions(value = {}),沒設置默認值,需要對value進行賦值。

需要注意如果這樣寫 @RequiresPermissions(value = "")新註解上,新註解的value會一直使用這個值,即使你用新註解的時候填了value也是不會生效的。所以需要這樣寫@RequiresPermissions(value = {})

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequiresPermissions(value = {})
public @interface ShiroRequiresPermissions {

    @AliasFor(annotation = RequiresPermissions.class, attribute = "value")
    String[] value();

    @AliasFor(annotation = RequiresPermissions.class, attribute = "logical")
    Logical logical() default Logical.AND;

    String remark() default "";
}

總結:註解組合需要分三步,1.自定義新註解 2.新註解寫要引入的註解 3.使用@AliasFor建立新老註解的屬性對應關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章