Annotation


前言

重复注解?,看看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果然厉害,以后写代码一定向函数式编程靠拢

测试类的执行结果:
在这里插入图片描述
完美解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值