前言
重复注解?,看看java8如何实现
一、问题引入
对于Mybatis,我想大家并不陌生,那么注解形式的sql也应该接触过,在开发中有这样的一个地方例如:
/**
* 查询列表
* @param param 参数
*/
@Select("sql 或者 加script的sql")
@Results({
@Result(column = "file_id", property = "fileId"),
@Result(column = "file_type", property = "fileType")
})
List<FileIdType> getDataFileList(@Param("param") Integer param);
在查询的时候需要将文件id与类型查询出来或者是聚合的结果查询出来,但是不做Result映射查询的结果为空,原因是FileIdType中的属性对应@Result的property ,这时就需要用注解的方式加映射了(当然这里如果sql不涉及表外的字段,可直接使用xml中的BaseResultMap @ResultMap(“BaseResultMap”),注解的情况同上面的代码,原始实现重复注解的方式就是这样,但可不可以不要@Results,直接使用多个@Result?,像这样重复使用
@Anno()
@Anno()
public method()
接下来看java8怎样解决
二、java8重复注解实现
1、创建存放重复注解的注解类
package com.study.java.annotition;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author bxz
* @date 2021/11/26
*/
@Target({ElementType.TYPE,ElementType.FIELD,
ElementType.METHOD,ElementType.PARAMETER,
ElementType.TYPE_PARAMETER,ElementType.CONSTRUCTOR,
ElementType.TYPE_USE,ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationPluses {
AnnotationPlus[] value();
}
2、创建实际用于注解的类
package com.study.java.annotition;
import java.lang.annotation.*;
/**
* @author bxz
* @date 2021/11/26
*/
@Repeatable(AnnotationPluses.class)
@Target({ElementType.TYPE,ElementType.FIELD,
ElementType.METHOD,ElementType.PARAMETER,
ElementType.TYPE_PARAMETER,ElementType.CONSTRUCTOR,
ElementType.TYPE_USE,ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationPlus {
String value() default "";
}
注意@Repeatable(AnnotationPluses.class)这是实现重复注解的关键
3、创建使用了重复注解的类
package com.study.oth;
import com.study.java.annotition.AnnotationPlus;
/**
* @author bxz
* @date 2021/11/26
*/
@AnnotationPlus
@AnnotationPlus
public class AnnotationPlusClass {
@AnnotationPlus("plus1")
@AnnotationPlus("plus2")
public void exec(){
}
}
4、测试类
package com.study.oth;
import com.study.java.annotition.AnnotationPlus;
import java.util.Arrays;
/**
* 注解测试
*
* @author bxz
* @date 2021/11/26
*/
public class TestAnnotationPlus {
public static void main(String[] args) throws NoSuchMethodException {
//lambda处理 查看类重复注解
Arrays.stream(AnnotationPlusClass.class.getAnnotationsByType(AnnotationPlus.class)).forEach((e)->System.out.println("class anno:" + e.value()));
//一般外部迭代查看
for (AnnotationPlus ap : AnnotationPlusClass.class.getAnnotationsByType(AnnotationPlus.class)){
System.out.println("class anno:"+ap.value());
}
//类重复注解
Arrays.stream(AnnotationPlusClass.class.getMethod("exec").getAnnotationsByType(AnnotationPlus.class)).forEach((e) -> System.out.println("method anno:" + e.value()));
}
}
先看看上面的代码通过lambda实现处理打印也就一行代码搞定,但是用传统迭代被迫用了三行代码,lambda果然厉害,以后写代码一定向函数式编程靠拢
测试类的执行结果:
完美解决