公共枚举组件Enum

rdf-component-enum

你是否因为每次新增枚举类都要添加几个获取值或者枚举的方法而苦恼,虽然都是复制粘贴而已,但还是无法忍受,该组件的存在就是为了解决这个问题。

一、效果

本组件提供了枚举的基本功能和一些常用的方法,同时还支持自动获取枚举描述并透出功能。

1. 基础用法

在这里插入图片描述

  • 上图加粗字体内容为定义的枚举字段,上面的方法为该组件提供的方法,组件定义字段有 val 值code 码desc 描述

  • 方法说明

方法说明
getByVal通过枚举值获取枚举对象
getByDesc通过枚举描述获取枚举对象
getByCode通过枚举码获取枚举对象
getValByDesc通过枚举描述获取枚举值
getCodeByDesc通过枚举描述获取枚举码
getDescByVal通过枚举值获取枚举描述
getDescByCode通过枚举码获取枚举描述

2. 枚举描述自动透出

响应结果,statusDesc 字段内容的透出无需手动setter

{
    "name": "rdf",
    "status": 1,
    "statusDesc": "点赞"
}

二、引入依赖

  • 引入maven依赖

可直接在maven项目pom添加如下依赖,可以直接拉取改依赖,但前提是配置了本人Gitee私服仓库!配置方式

<dependencies>
    <dependency>
        <groupId>com.lsl.rdf</groupId>
        <artifactId>rdf-component-enum</artifactId>
        <!-- 最新版本 -->
        <version>1.0.0-RELEASE</version>
    </dependency>
</dependencies>
  • 直接jar包引入

项目jar包本人已经打包部署到个人的私服仓库中了,可自行下载需要的jar及版本!下载地址

三、使用方式

1. 基础枚举类定义于使用

  1. 定义VCD类型枚举类,我们定义的是普通的枚举类,然后继承我们提供的枚举基类,这样我们就可以使用我们基类提供的方法了,具体定义方式如下:
import com.lsl.rdf.enums.BasicsVCDEnum;

public class TypeEnum extends BasicsVCDEnum {
    public static final TypeEnum LIKE = new TypeEnum(1, "LIKE", "点赞");
    public static final TypeEnum COLLECT = new TypeEnum(2, "COLLECT", "收藏");
    public static final TypeEnum TRANSMIT = new TypeEnum(3, "TRANSMIT", "转发");
    public static final TypeEnum ATTENTION = new TypeEnum(4, "ATTENTION", "关注");

    public TypeEnum(Integer val, String code, String desc) {
        super(val, code, desc);
    }
}
  1. 基本使用
public class Test {

    public void test() {
        Integer val = TypeEnum.ATTENTION.getVal();
        String code = TypeEnum.ATTENTION.getCode();
        String desc = TypeEnum.ATTENTION.getDesc();

        TypeEnum attention = TypeEnum.getByCode(TypeEnum.class, "ATTENTION");
        TypeEnum attention1 = TypeEnum.getByDesc(TypeEnum.class, "关注");
        TypeEnum attention2 = TypeEnum.getByVal(TypeEnum.class, 4);

        String attention3 = TypeEnum.getCodeByDesc(TypeEnum.class, "关注");
        String attention4 = TypeEnum.getDescByCode(TypeEnum.class, "ATTENTION");
        String attention5 = TypeEnum.getDescByVal(TypeEnum.class, 4);
        Integer attention6 = TypeEnum.getValByDesc(TypeEnum.class, "关注");
    }
}
  1. 说明

    • 什么叫VCD类型V对应的是valC对应的是codeD则对应的是descVCD类型表示提供这三个字段的支持,使用方式则是继承VCD的基类枚举类,
      这里我们提供了5种类型的枚举基类,可根据实际需要选择继承的枚举基类;
    枚举基类支持字段
    BasicsVEnum仅支持 val
    BasicsCEnum仅支持 code
    BasicsVDEnum支持 val和desc
    BasicsCDEnum支持 code和desc
    BasicsVCDEnum支持 val、code和desc
    • 枚举类字段需要定义为public static final,可参考上面的例子;
    • 使用枚举基类提供的方法,需要将枚举子类传入TypeEnum.getByVal(TypeEnum.class, 4);才能定位到子类对象。

2. 自动透出枚举描述

1. 开启功能

该功能主要是基于AOP进行织入处理的,所以第一步需要先开启我们的AOP,开启方式有两种:

  1. 通过Enable注解方式开启,直接在启动类添加@EnableEnumDesc
@SpringBootApplication
@EnableEnumDesc
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

启动时可看到InjectEnumDescAop初始化完成的日志

2021-05-07 09:27:33.831  INFO 6952 --- [           main] com.lsl.rdf.config.InjectEnumDescConfig  : InjectEnumDescAop initialization completed.
  1. 通过配置文件创建AOP,新增配置类ApplicationConfig,添加我们AOP类的Bean即可。
@Component
public class ApplicationConfig {
    @Bean
    public InjectEnumDescAop injectEnumDescAop() {
        return new InjectEnumDescAop();
    }
}
2. 指定类于字段
@InjectEnumTarget
public class ResultVo {

    private Long id;
    
    private String name;
    
    private String password;
    
    @InjectDescByVal(enumClass = StatusEnum.class)
    private Integer status;
    
    private String statusDesc;
    
    @InjectDescByVal(enumClass = TypeEnum.class, targetFieldName = "typeMsg")
    private Integer type;
    
    private String typeMsg;
    
    @InjectDescByCode(enumClass = StateEnum.class)
    private String state;
    
    private String stateDesc;
}

如上例子所示,@InjectEnumTarget注解用于指定需要织入的类,@InjectDescByVal用于指定枚举值对应的字段上,enumClass入参用于指定对应的枚举
类,targetFieldName入参用于指定用于装载枚举描述的字段,默认是枚举值字段加上Desc后缀,如果刚好匹配默认值则无需添加targetFieldName这个入
参,反之则需要指定字段名称,@InjectDescByCode 区别在于对应的枚举类是CD类型。

3. 指定接口
@Service
public class DemoServiceImpl implements DemoService {

    @Autowired
    private UserMapper userMapper;

    @Override
    @InjectEnumResult
    public ResultVo selectOne(@LockTarget("id") Long id) {
        return userMapper.queryOne(id);
    }
}

最后我们还需要指定织入的接口,直接在接口的实现方法上添加@InjectEnumResult注解就可以了。

看下结果:

{
    "id": 1,
    "name": "瞌睡虫",
    "password": null,
    "status": 1,
    "statusDesc": "点赞",
    "type": 2,
    "typeMsg": "关注",
    "state": "OK",
    "stateDesc": "成功"
}
4. 说明
  • 目前我们织入只支持简单的对象或者list,对于嵌套式的对象需要自动透出则需要自定义AOP才行,如:
@InjectEnumTarget
public class A {
   @InjectDescByVal(enumClass = StatusEnum.class)
   private Integer status;
   
   private String statusDesc;
}

@InjectEnumTarget
public class B {

    @InjectDescByCode(enumClass = StateEnum.class)
    private String state;
    
    private String stateDesc;

    private A a;
}

这时透出B时,A对象里的字段是无法自动处理透出的。

3. 自定义织入AOP

你在用我们自动透出枚举描述功能的时候,可能会遇到一个问题,就是织入的接口的返回并不是一个简单的对象或者list,这时我们的织入就失效了,看下我们的AOP实现

@Aspect
public class InjectEnumDescAop {

    @Pointcut("@annotation(com.lsl.rdf.annotation.InjectEnumResult)")
    public void pointCut() {
    }

    @AfterReturning(returning = "result", pointcut = "pointCut()")
    public Object afterReturn(Object result) {
        // 自定义代码快 start
        if (result instanceof List) {
            EnumDescInjectUtil.invadeFieldsSetDesc((List<Object>) result);
        } else {
            EnumDescInjectUtil.invadeFieldSetDesc(result);
        }
        // 自定义代码快 end
        return result;
    }
}

可以看到我们只区分list对象和简单对象,如果你的接口返回的是你们的包装体类的话,对于嵌套对象我们是无法处理的,这时就需要自定义AOP了,然后调用我们
EnumDescInjectUtil提供的方法,就可以实现定制化处理了,然后再通过配置类的方式初始化Bean就大功告成了。

四、联系作者

有发现有bug、建议或者有什么问题想问的,欢迎随时联系。

  • QQ群:1083977145
  • 邮箱:lsl.yx@foxmail.com

五、更多推荐

可视化的Mybatis反编译工具,帮助你根据数据库表生成entity,dao接口和Mapper映射文件。

基于注解实现的分布式锁,分布式锁原来可以这么简单!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值