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


    最近做的都是迁移工作,纯粹的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,今天终于有一点小开心,因为把学到的知识用到了项目里,💪💪💪

  • 相关阅读:
    带你初识JavaScript基础语法
    主定理(Master Theorem)推导和理解(2)
    Golang语言设计模式的实现—工厂模式
    Threejs_04 gui调试开发
    指针进阶(续)
    如何使用宝塔面板部署MySQL数据库,并结合内网穿透实现固定公网地址远程连接
    MySQL高级:函数(二)自定义函数
    Django源码学习——配置文件解析
    记一次fineBI的增量删除更新BUG
    技术债务(Technical Debt)
  • 原文地址:https://blog.csdn.net/yanweijie0317/article/details/126177798