avatar

十六小站

欢迎来到我的个人主页! 期待与您分享我的经验与故事,一起探索技术的无穷可能!

  • 首页
  • NAS专题
  • 关于
Home AOP实现消息监听发送到MQ
文章

AOP实现消息监听发送到MQ

Posted 2023-09-9 Updated 2024-10- 19
By 十六 已删除用户
6~8 min read

SpringAOP是面向切面的编程范式

在项目中我们用到许多需要从项目执行中间抓取数据并进行分析或者发送到其他平台的操作。

如:日志采集、数据同步等,不可能每次改造都去在每个业务方法里面增加代码。AOP切面则是一个很好的解决方案。在项目中我们用到许多需要从项目执行中间抓取数据并进行分析或者发送到其他平台的操作,如:日志采集、数据同步等,不可能每次改造都去在每个业务方法里面增加代码。AOP切面则是一个很好的解决方案。

AspectJ是更高级的AOP实现,本文主要讲AspectJ

AspectJ 和 Spring AOP 是两种不同的 AOP 实现,但它们可以一起使用,而且在某种程度上可以说 AspectJ 是更为强大和灵活的 AOP 解决方案,而 Spring AOP 则是在 Spring 框架中的一种轻量级 AOP 实现。

AspectJ 可以独立于 Spring 框架使用,也可以与 Spring 框架集成。在 AspectJ 中,你可以使用更复杂的切点表达式和切面定义,同时也能够操纵字节码级别的织入。AspectJ 提供了编译时织入和运行时织入两种织入方式。

Spring AOP 则是 Spring 框架的一部分,它基于代理模式,主要使用 JDK 动态代理和 CGLIB 代理,在运行时生成代理对象来实现切面的织入。Spring AOP 的切点表达式相对简单,适用于基本的横切关注点。

在某些情况下,你可以同时使用 AspectJ 和 Spring AOP 来获得更大的灵活性。例如,你可以使用 AspectJ 来处理更复杂的横切关注点,而使用 Spring AOP 来处理轻量级的横切关注点,从而充分利用两者的优势。

都能做哪些事情

AspectJ 是一种功能强大的面向切面编程(AOP)解决方案,可以用于在代码中实现各种横切关注点,从而提高代码的模块化性、可维护性和可重用性。AspectJ 可以实现以下多种功能:

  1. 日志记录: 可以在方法的进入和退出时插入日志记录代码,方便跟踪和分析程序的执行流程。
  2. 事务管理: 可以实现声明式的事务管理,通过在方法执行前后插入事务开启、提交、回滚等代码,实现更好的事务控制。
  3. 异常处理: 可以在方法抛出异常时插入代码,实现异常的捕获、转化或处理。
  4. 安全性: 可以在方法执行前进行权限检查,确保只有授权用户可以访问某些方法。
  5. 性能监控: 可以在方法的进入和退出时插入代码,统计方法的执行时间,帮助进行性能监控和优化。
  6. 缓存管理: 可以实现在方法执行前后,对方法的结果进行缓存管理,提高性能。
  7. 对象生命周期管理: 可以在对象的创建、初始化、销毁等时刻插入代码,实现对象的生命周期管理。
  8. 自定义切面: 可以编写自定义的切面来实现特定的横切关注点,满足项目的具体需求。
  9. 字段访问: 可以在访问字段(属性)的时候插入代码,实现字段的访问控制或跟踪。
  10. 方法调用: 可以在方法调用的时候插入代码,实现方法的前置、后置或环绕增强。
  11. 对象构造: 可以在对象构造时插入代码,实现在构造过程中的额外操作。

    集成方法

    本文是基于注解的实现方式。(在需要获取SQL并发送到MQ的mapper层添加注解)

这里着重要说明的是,@AfterReturning和@After两个注解的不同

@After是在切入点方法执行结束后就会执行。 @AfterReturning在切入点方法执行成功后会执行,如果执行抛出异常,则不进入该方法。

@Aspect
@Component
public class MQSynAspect {

    private static Logger log = LoggerFactory.getLogger(SqlUtils.class);//日志

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Autowired
    private MqMessageService mqMessageService;

    @Pointcut("@annotation(com.sinoprof.cms.aop.bi.MQUpdate)")
    public void daoAspect() {
    }

    @AfterReturning("daoAspect()")
    public void afterReturning(JoinPoint joinPoint) {
        //执行成功才会进到这里调用
        getUpdateDataByAnnot(joinPoint);
        log.info("执行完成后调用,执行结果{}", joinPoint);
    }

    @AfterThrowing(value = "daoAspect()", throwing = "ex")
    public void afterThrowingAdvice(Throwable ex) {
       ex.printStackTrace();
        // 目标方法抛出异常,可以根据异常进行处理
        log.info("目标方法抛出异常:{}", ex.getMessage());
    }

    @Around("daoAspect()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object proceed = proceedingJoinPoint.proceed();
        // 3.获取SQL
//        String sql = SqlUtils.getMybatisSql(proceedingJoinPoint, sqlSessionFactory);
        return proceed;
    }
}

这部分主要是切入点功能

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
@Documented
public @interface MQUpdate {

}

目前还正在开发未整理,先奉上半成品。留作记录

后端, 菜鸟入坑
Java
License:  CC BY 4.0
Share

Further Reading

Dec 16, 2025

异步通知中事务的处理

公司项目之前因为涉及到国产化自主可控改造 ,所以将数据库从oracle换成了性能相对低很多的国产数据库,所以设计了分库分表的方案 。有分必有合,那么在设计到台账之类的集团公司查询的时候就会存在聚合查询的问题。所以引入了es,其方案如下 : 原数据同步方案 由于可能存在事务问题,此处使用了MQ的延迟队

Nov 28, 2025

线程池优化

前言 博主公司的项目一直有一个问题 ,跑时间长了会非常卡顿 ,必须要重启才能解决任务 ,之前没空排查问题 ,现在终于有时间来排查和解决这个问题了 。 打印jvm的dump信息辅助排查 先找到进程id:jps 打印堆栈信息输出到文件:jsatck -l [进程id] > /tmp/jvm.dump 分

Sep 30, 2025

微服务之Auth篇

auth服务重要是认证授权,签发jwt token使用。 生成密钥对 # 在项目 src/main/resources 下生成 jwt.jks(演示用,生产用更严格的密码/keystore) keytool -genkeypair \ -alias jwt \ -keyalg RSA \

OLDER

群晖部分异常修复

NEWER

Idea导出功能类图

Recently Updated

  • 异步通知中事务的处理
  • 线程池优化
  • KubeShpere部署(4.1.2)
  • 微服务之Auth篇
  • 记一次前端优化(vue2)

Trending Tags

Java Docker 前端 中间件 数据库 群晖 unraid

Contents

©2025 十六小站. Some rights reserved.

Using the Halo theme Chirpy