• 软件代码设计-小优化(四)


    最近做的都是迁移工作,纯粹的CV大法,不值一提。

    看了书和文章,总结不起来,还是差一些东西。

    我发现还是要多写代码,多实践。这样才能把从别人那看到的、学到的拿来成为自己的。

    今天依然是CV大法,但是我发现一天Controller类里,所有的接口都有一段共同的,例如根据设备Id验证设备是否存在。

    献丑一下我仅有的知识,这是不是可以来个切面或者说来个拦截器,最开始想的是根据请求路径拦截,只要是指定路径的都要先走一遍验证。这个想法没有尝试。

    我采用了切面,切入点为自定义通知。

    简单介绍一下实现思路

    1. 在需要验证设备的方法上,添加自定义注解

    2. 自定义切面类,说白了就是增加@Aspect+@Component注解,交由spring来管理

    3. 定义切入点,比如是在哪个类的哪些方法,或者有指定注解的地方切入

    4. 定义切入的时刻,我的需求是在目标方法之前执行,所以用的@Before

    具体代码如下:

    1. @Slf4j
    2. @Aspect
    3. @Component
    4. public class ValidDeviceBeforeMapAspect {
    5. public IWebDeviceService webDeviceService = SpringUtils.getBean(IWebDeviceService.class);
    6. /**
    7. * 构建
    8. */
    9. public ValidDeviceBeforeMapAspect() {
    10. log.info(" construct ......ValidDeviceBeforeMapAspect..........");
    11. }
    12. /**
    13. * 声明AOP签名
    14. */
    15. @Pointcut(value = "@annotation(com.bdht.system.map.aspect.DeviceValidated)")
    16. public void pointcut() {
    17. }
    18. @Before(value = "pointcut()")
    19. public void doBefore(JoinPoint joinPoint) {
    20. checkDevice(joinPoint);
    21. }
    22. private void checkDevice(JoinPoint joinPoint) {
    23. long deviceId = 0L;
    24. for (Object arg : joinPoint.getArgs()) {
    25. Class thisClass = arg.getClass();
    26. try {
    27. Field deviceIdField = thisClass.getField("deviceId");
    28. deviceId = Objects.nonNull(deviceIdField) ? (Long)deviceIdField.get(arg) : 0L;
    29. } catch (Exception e) {
    30. e.printStackTrace();
    31. }
    32. }
    33. DeviceEntity deviceEntity = webDeviceService.getDeviceEntityById(deviceId);
    34. if(Objects.isNull(deviceEntity)) throw new ServiceException("设备ID填写有误");
    35. }

    在需要验证设备的接口,增加注解:@DeviceValidated

    经过测试,功能是没问题的。 

    get到的点:

    1. @Before通知,是通过JoinPoint去获取请求参数及类

    2. ProceedingJoinPoint,是环绕通知专属

    无数的CV,今天终于有一点小开心,因为把学到的知识用到了项目里,💪💪💪

  • 相关阅读:
    〖Python APP 自动化测试实战篇①〗 - 大话闲扯 APP 自动化
    ES6——ES6中对象、字符串、数组的扩展方法
    【SwinTransformer源码阅读二】Window Attention和Shifted Window Attention部分
    力扣108. 将有序数组转换为二叉搜索树
    (个人杂记)第六章 跑马灯实验
    java-net-php-python-springboot羽毛球场地管理系统演示录像计算机毕业设计程序
    基于数组寻址的SCL算法实现S7-1200_1500中的配方功能Recipe
    共享单车需求量登记分类及影响因素分析——基于机器学习模型的比较分析
    背包问题-完全背包
    VLAN中继协议
  • 原文地址:https://blog.csdn.net/yanweijie0317/article/details/126177798