Open TFdream opened 2 years ago
@Repeatable注解是JDK8加入的一个新特性,是java8为了解决同一个注解不能重复在同一类/方法/属性上使用的问题。
举一个比较贴近开发的例子,在spring/springboot我们引入资源文件可以使用注解@PropertySource
public @interface PropertySource { ... String[] value(); }
引入单个资源文件:
@PropertySource("classpath:sso.properties") public class Application { }
那要引入多个资源文件怎么办,没事,我把PropertySource中的value设置成String[]数组就行了
@PropertySource({"classpath:sso.properties","classpath:dubbo.properties","classpath:systemInfo.properties"}) public class Application { }
就spring引入配置文件来讲,肯定是没事问题的。但是如果注解中2个值存在依赖关系,那么这样就不行了。比如下面这个
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) //@Repeatable(Validates.class) public @interface Validate { /** * 业务类型 * @return */ String bizCode(); /** * 订单类型 * @return */ int orderType(); }
上面的@validate注解,bizcode和orderType是一对一的关系,我希望可以添加如下的注解
@Validate(bizCode = "fruit",orderType = 1) @Validate(bizCode = "fruit",orderType = 2) @Validate(bizCode = "vegetable",orderType = 2) public class BizLogic2 { }
很抱歉在java8之前,这种方式不行,不过你可以这么做,新建一个如下的注解
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented public @interface Validates { Validate[] value(); }
然后对应代码修改如下
@Validates(value = { @Validate(bizCode = "fruit",orderType = 1) @Validate(bizCode = "fruit",orderType = 2) @Validate(bizCode = "vegetable",orderType = 2) }) public class BizLogic2 { }
在java8的@Repeatable出来之后,我们在不改动@Validates的情况下,对@Validate进行修改,增加@Repeatable(Validates.class)
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Repeatable(Validates.class) public @interface Validate { /** * 业务类型 * @return */ String bizCode(); /** * 订单类型 * @return */ int orderType(); }
那么就可以在类上使用多个@Validate注解了。
回过头来看下@PropertySource和@PropertySources也是如此
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(PropertySources.class) public @interface PropertySource { }
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface PropertySources { PropertySource[] value(); }
@Repeatable注解是JDK8加入的一个新特性,是java8为了解决同一个注解不能重复在同一类/方法/属性上使用的问题。
应用场景
举一个比较贴近开发的例子,在spring/springboot我们引入资源文件可以使用注解@PropertySource
引入单个资源文件:
那要引入多个资源文件怎么办,没事,我把PropertySource中的value设置成String[]数组就行了
就spring引入配置文件来讲,肯定是没事问题的。但是如果注解中2个值存在依赖关系,那么这样就不行了。比如下面这个
上面的@validate注解,bizcode和orderType是一对一的关系,我希望可以添加如下的注解
很抱歉在java8之前,这种方式不行,不过你可以这么做,新建一个如下的注解
然后对应代码修改如下
在java8的@Repeatable出来之后,我们在不改动@Validates的情况下,对@Validate进行修改,增加@Repeatable(Validates.class)
那么就可以在类上使用多个@Validate注解了。
回过头来看下@PropertySource和@PropertySources也是如此