AOP实现消息监听发送到MQ
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 可以实现以下多种功能:
- 日志记录: 可以在方法的进入和退出时插入日志记录代码,方便跟踪和分析程序的执行流程。
- 事务管理: 可以实现声明式的事务管理,通过在方法执行前后插入事务开启、提交、回滚等代码,实现更好的事务控制。
- 异常处理: 可以在方法抛出异常时插入代码,实现异常的捕获、转化或处理。
- 安全性: 可以在方法执行前进行权限检查,确保只有授权用户可以访问某些方法。
- 性能监控: 可以在方法的进入和退出时插入代码,统计方法的执行时间,帮助进行性能监控和优化。
- 缓存管理: 可以实现在方法执行前后,对方法的结果进行缓存管理,提高性能。
- 对象生命周期管理: 可以在对象的创建、初始化、销毁等时刻插入代码,实现对象的生命周期管理。
- 自定义切面: 可以编写自定义的切面来实现特定的横切关注点,满足项目的具体需求。
- 字段访问: 可以在访问字段(属性)的时候插入代码,实现字段的访问控制或跟踪。
- 方法调用: 可以在方法调用的时候插入代码,实现方法的前置、后置或环绕增强。
- 对象构造: 可以在对象构造时插入代码,实现在构造过程中的额外操作。
集成方法
本文是基于注解的实现方式。(在需要获取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 {
}
目前还正在开发未整理,先奉上半成品。留作记录