首页 > 其他分享 >自定义注解

自定义注解

时间:2023-11-10 16:56:49浏览次数:39  
标签:codeTableList fields 自定义 res field CodeAnnotationProperties 注解 sub

1、类注解

/**
 * 需要动态查询CodeTable数据字典时,在类上配置该注解
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CodeAnnotation {

}

2、字段注解

/**
 * 需要动态查询CodeTable数据字典时,在对应str属性上配置该注解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CodeAnnotationProperties {

    String codeKeyProperties();

    String codeType();
}

3、Aspectj

@Aspect
@Component
public class CodeAspect {
    @Autowired
    private CodeTableService codeTableService;

    /**
     * 自动属性值注入
     */
    @AfterReturning(value = "execution(* com.lujie.source.mode..service.*.*(..)) || execution(* com.lujie.common.service.BaseService.*(..))", returning = "res")
    public void serviceReturn(JoinPoint joinPoint, Object res) throws Exception {
        if (ObjectUtil.isEmpty(res)) {
            return;
        }
        //是否为集合
        Boolean isList = res instanceof List ? true : false;
        Object obj = isList ? ((List<?>) res).get(0) : res;
        Class objClass = obj.getClass();
        Annotation[] allAnnos = objClass.getAnnotations();
        //若类标注了 @CodeAnnotation
        if (Arrays.stream(allAnnos).anyMatch(i -> i.annotationType() == CodeAnnotation.class)) {
            Field[] fields = objClass.getDeclaredFields();
            //遍历所有字段
            for (Field field : fields) {
                //若字段标注了 @CodeAnnotationProperties
                if (Arrays.stream(field.getAnnotations()).anyMatch(i -> i.annotationType() == CodeAnnotationProperties.class)) {
                    //获取标注类型
                    CodeAnnotationProperties codeAnnotationProperties = field.getAnnotation(CodeAnnotationProperties.class);
                    String codeType = codeAnnotationProperties.codeType();
                    List<CodeTable> codeTableList = codeTableService.findByType(codeType);
                    if (isList) {
                        for (Object sub : (List) res) {
                            setValue(fields, field, sub, codeTableList);
                        }
                    } else {
                        setValue(fields, field, res, codeTableList);
                    }
                }
            }
        }
    }

    /**
     * @param fields 字段集合
     * @param field  字段str
     * @param sub    对象
     * @throws Exception
     */
    public void setValue(Field[] fields, Field field, Object sub, List<CodeTable> codeTableList) throws Exception {
        CodeAnnotationProperties codeAnnotationProperties = field.getAnnotation(CodeAnnotationProperties.class);
        String codeKeyProperties = codeAnnotationProperties.codeKeyProperties();
        //寻找key
        for (Field field2 : fields) {
            if (field2.getName().equals(codeKeyProperties)) {
                field2.setAccessible(true);
                Object obj2 = field2.get(sub);
                CodeTable codeTable = codeTableList.stream().filter(i -> i.getCodeKey().equals(String.valueOf(obj2))).findFirst().orElse(null);

                //将值设置到str字段中
                field.setAccessible(true);
                field.set(sub, (ObjectUtil.isNotEmpty(codeTable) ? codeTable.getCodeName() : null));
            }
        }
    }
}

标签:codeTableList,fields,自定义,res,field,CodeAnnotationProperties,注解,sub
From: https://www.cnblogs.com/yifanSJ/p/17824479.html

相关文章

  • layer.load底部添加自定义文字(文字居中效果)
    varindex=layer.load(2,{shade:[0.3,'#000'],success:function(layero){layero.find('.layui-layer-content').after('<divclass="layer-load">加载中...</div>'); layero.find('.la......
  • 实现MyBatisPlus自定义sql注入器
    目标:新增mysql下的插入更新的语法INSERTINTO%s%sVALUES%sONDUPLICATEKEYUPDATE%s新增方法类,新增的方法名称为insertOrUpdate和insertOrUpdateBatch方法,但其mapper层的方法名为insertOrUpdate方法importcom.baomidou.mybatisplus.annotation.IdType;importcom.b......
  • Spring6.0官方文档示例:(25)@RequestScope注解
    packagecn.edu.tju.controller.listener;importorg.springframework.stereotype.Component;importorg.springframework.web.context.annotation.RequestScope;importjava.util.Date;@Component@RequestScope//@Scope(value="request",proxyMode=Sco......
  • elementui 自定义上传接口上传完图片之后无法再进行第二次上传,踩坑解决
    1,上传功能<el-upload action="" ref='upload' :http-request="handleFileUpload" :limit="1" :show-file-list="false"> <iclass="el-icon-upload2"></i></el-upload>2,在上传后......
  • Unity 自定义Postprocess 景深和散景模糊
    前言本篇将介绍如何通过添加RenderFeature实现自定义的postprocess——散景模糊(BokehBlur)和景深关于RenderFeature的基础可以看这篇https://www.cnblogs.com/chenglixue/p/17816447.html景深定义:聚焦清晰的焦点前后可接受的清晰区域,也就是画面中景象清晰的范围如下图相......
  • springboot2 @Mapper注解问题
    @MapperpublicinterfaceDeptMapper{   DeptgetById(Integerid);}问:这段代码是把这个接口注入到spring的bean容器当中去了,但是spring的bean容器不是存的实例化对象吗?答:在Spring框架中,将一个类(或接口)注入到Spring的容器中,即将其声明为一个Bean。这样,Spring容器会负......
  • JavaScript--String对象&自定义对象&Windows对象
    String对象 varstr1=newString("abc")varstr2="abc"trim():去除字符串前后两端的空白字符自定义对象  BOM对象 1、Windowconfirm方法会产生一个返回值varflag=confirm("");按确定返回true按取消返回falsesetTimeout()只执行一次setInterval()循环执行......
  • 19、Flink 的Table API 和 SQL 中的自定义函数及示例(4)
    (文章目录)本文展示了自定义函数在Flinksqlclient的应用以及自定义函数中使用pojo的示例。本文依赖flink、kafka集群能正常使用。本文分为2个部分,即自定义函数在Flinksqlclient中的应用以及自定义函数中使用pojo数据类型。本文的示例如无特殊说明则是在Flink1.17版本中运......
  • Spring 缓存注解这样用,太香了!
    作者最近在开发公司项目时使用到Redis缓存,并在翻看前人代码时,看到了一种关于@Cacheable注解的自定义缓存有效期的解决方案,感觉比较实用,因此作者自己拓展完善了一番后分享给各位。Spring缓存常规配置SpringCache框架给我们提供了@Cacheable注解用于缓存方法返回内容。但......
  • IDEA 集成 EasyCode 插件,快速生成自定义 mybatisplus 代码
    IDEA集成easyCode插件在idea插件市场中,搜索EasyCode插件,下载并进行安装EasyCode插件介绍1.修改作者名称EasyCode插件可以修改作者名称,即生成代码后,注释中自动添加相应作者的姓名。2.TypeMapperTypeMapper指的是生成mapper.xml文件中数据库中的字段和java......