JAVA动态增强一个BaseController的已经存在的接口

java,动态,增强,一个,basecontroller,已经,存在,接口 · 浏览次数 : 3

小编点评

## 代码实现 ```java @Aspect @Componentpublic class NioTaskInfoControllerAdvice { private Logger logger = LoggerFactory.getLogger(NioTaskInfoControllerAdvice.class.getSimpleName()); private String msgStartSuffix = \"申请号:\"; @Autowired private FeeInfoService feeInfoService; @Pointcut(value = "execution(* com.XX.XX.XX.interfaces.XXXController.finish(..))\") public void pointCut() { } @AfterReturning(value = "pointCut()\", returning = "result") public void afterReturning(JoinPoint joinPoint, Object result) { logger.info("\nXX完成接口增强---成功执行之后调用返回通知通知织入增强业务逻辑\n"); try { if (result instanceof Result) { if (((Result result1) == null && result instanceof String) && result1.isSuccess()) { logger.info("\n回调状态---->XX已完成----->准备生成BB确认台账\n"); } else { logger.info("\n回调状态---->XX未完成....\n"); } } } catch (Exception e) { e.printStackTrace(); logger.error("\nXX完成---->BB确认自动生成台账织入失败....\n"); } } } ``` ## 总结 1. 代码中使用了 @Pointcut 注解来定义切入点,并在切入点加入 @AfterReturning 注解来处理增强后的结果。 2. 在切入点,根据结果类型判断并进行逻辑处理。 3. 在 `afterReturning` 方法中,根据结果类型判断回调状态并进行处理。 4. 在 `pointCut` 方法中,使用 `@Autowired` 注入 `FeeInfoService` 用于处理业务逻辑。 5. 在 `afterReturning` 方法中,使用 `@AfterReturning` 注解指定返回值为 `result`,并根据结果类型进行处理。 6. 为了处理 Integer 类型为 0 的特殊情况,使用 `if` 语句进行判断。

正文

使用场景

前提场景

我们多个系统同时继承了某一个通用系统,通用系统的接口是不会允许随意改变的,其他子系统都依赖于Base系统的通用接口

目标需求场景

但是有一个业务,需要给某一个公共接口增加子系统独有的业务功能;比如某个接口完成之后会往其他的业务修改状态

解决方案

通常使用做法-01 集成BaseController的接口,从写这个业务代码,然后覆盖掉原有通用接口的业务

通常使用做法-02 spring的最重要的核心特性之一---AOP切面增强

推荐使用AOP技术增强。

实现代码 --使用返回通知


/**
 * 动态增强BaseController的接口代码
 */
@Aspect
@Component
public class NioTaskInfoControllerAdvice {

    Logger logger = LoggerFactory.getLogger(NioTaskInfoControllerAdvice.class.getSimpleName());

    private String msgStartSuffix = "申请号:";

    @Autowired
    private FeeInfoService feeInfoService;


    //标识切入点的特征
    @Pointcut(value = "execution(* com.XX.XX.XX.interfaces.XXXController.finish(..))")
    public void pointCut() {

    }


    /**
     * XX完成拓展--BB需要自动生成费用确认台账
     * 返回通知(@AfterReturning):当被增强的方法 成功执行之后调用通知
     */
    @AfterReturning(value = "pointCut()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        logger.info("XX完成接口增强---成功执行之后调用返回通知通知织入增强业务逻辑");
        try {
            if (result instanceof Result) {
                if (((Result<?>) result).isSuccess()) {
                    logger.info("回调状态---->XX已完成----->准备生成BB确认台账");
                } else {
                    logger.info("回调状态---->XX未完成....");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("XX完成---->BB确认自动生成台账织入失败....");
        }
    }
}

额外还发现一个BUG Mybatis的动态SQL的if标签对于Integer数据类型为0的判断

平时我们的判空代码直接是抄过来的

<if test="status!= null  and status!= ''">
  status=#{status},
</if>
  • 在这段代码中传入0,如果传入的0是String类型的话是不会有问题的
  • 但是如果传入的0是Integer类型的,Integer的0会被mybatis认为是空的字符

解决方案


<if test="status!= null>
  status=#{status},
</if>

与JAVA动态增强一个BaseController的已经存在的接口相似的内容:

JAVA动态增强一个BaseController的已经存在的接口

使用场景 前提场景 我们多个系统同时继承了某一个通用系统,通用系统的接口是不会允许随意改变的,其他子系统都依赖于Base系统的通用接口 目标需求场景 但是有一个业务,需要给某一个公共接口增加子系统独有的业务功能;比如某个接口完成之后会往其他的业务修改状态 解决方案 通常使用做法-01 集成BaseC

Java算法之动态规划详解-买卖股票最佳时机

①动态规划 动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、

【Java】JDK动态代理实现原理

代理模式 代理模式一般包含三个角色: Subject:主题对象,一般是一个接口,定义一些业务相关的基本方法。 RealSubject:具体的主题对象实现类,它会实现Subject接口中的方法。 Proxy:代理对象,里面包含一个RealSubject的引用,外部会通过这个代理对象,来实现RealSu

Java SpringBoot 中,动态执行 bean 对象中的方法

根据不同的条件,调用不同的 bean 对象,执行对象中的方法

SpringBoot 集成 Quartz + MySQL

Quartz 简单使用 Java SpringBoot 中,动态执行 bean 对象中的方法 源代码地址 => https://gitee.com/VipSoft/VipBoot/tree/develop/vipsoft-quartz 工作原理解读 只要配置好 DataSource Quartz 会

Groovy初学者指南

Groovy是一种基于Java平台的动态编程语言,它结合了Python、Ruby和Smalltalk等语言的特性,同时与Java无缝集成

JavaAgent寄生在目标进程中引起的ClassNotFoundException

今天有解决方案部的小伙伴反映,我公司XWind产品在分析客户应用程序的潜在性能问题时,总是显现诊断任务异常,为了定位问题的根因,我们马上要求解决方案部的小伙伴提供XWind相关的日志,从日志中找到了如下报错信息: 可以看到Java经典的动态加载类错误,org.apache.naming.java.j

京东二面:Sychronized的锁升级过程是怎样的

Java中Synchronized锁升级通过偏向锁、轻量级锁到重量级锁的动态转变,优化了多线程同步性能。偏向锁减少无竞争场景的开销,轻量级锁借助CAS与自旋优化低竞争环境,重量级锁确保高竞争下的互斥性。合理设计并发模型,监控锁状态并结合其他并发工具以充分利用锁升级优势。

C++的动态分派在HotSpot VM中的重要应用

众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持对于单继承的实现非常类似。 首先来体现一下C++的动态分派,如下: class Base1{ pub

[转帖]java中方法不要写太长的真正原因

https://www.iteye.com/blog/enetor-976070 java中一般建议一个方法不要写的过长,不方便维护和阅读是其中的一个原因,但是其真正性能的原因大家知道吗? 我们知道,JVM一开始是以解释方式执行字节码的。当这段代码被执行的次数足够多以后,它会被动态优化并编译成机器码