SpringAOP+RabbitMq实现⽇志记录
Spring AOP + RabbitMq实现⽇志记录
⼀. AOP是什么?
AOP的编程思想就是把业务逻辑和横切的问题进⾏分离,从⽽达到解耦的⽬的,使代码的重⽤性和开发效率⾼(⽬的是重⽤代码,把公共的代码抽取出来)
⼆. AOP的应⽤场景
1、⽇志记录(以下演⽰)
2、权限验证
3、效率检查
4、事务管理(spring 的事务就是⽤AOP实现的)
三. AOP 概念说明
① 切⾯(Aspect):指的就是通⽤功能的代码实现,⽇志切⾯(代码如下),它们都是普通的Java类:OperationLogAspect,可以简单地认为, 使⽤ @Aspect 注解的类就是切⾯
@Component
@Aspect
public class OperationLogAspect {
}
② ⽬标对象(Target):⽬标对象指将要被增强的对象,即包含主业务逻辑的类对象。或者说是被⼀个或者多个切⾯所通知的对象。
③ 连接点(Join point ):连接点就是被拦截到的程序执⾏点,因为Spring只⽀持⽅法类型的连接点,所以在Spring中连接点就是被拦截到的⽅法
@Before("pointcut()")
public void OperationLogPointCut(JoinPoint joinPoint){//这个JoinPoint参数就是连接点
}
④ 切⼊点(Pointcut):定义通知应该切⼊到什么地⽅,Spring⽀持的切⼊点就是⽅法调⽤,切⼊点的定义可以使⽤正则表达式,⽤以描述什么类型的⽅法调⽤。@Pointcut就是⽤来定义切⼊点的
@Pointcut("execution(* com.demomon.aop.service..*(..))")
public void pointcut(){
}
⑤ 通知(Advice):切⾯是⼀个类,⽽通知就是类⾥的⽅法以及这个⽅法如何织⼊到⽬标⽅法的⽅式(⽤@AfterReturning和@Around 标注的⽅法)。根据织⼊到⽬标⽅法⽅式的不同,⼀共可以分为5种:
前置通知(Before)
后置通知(AfterReturning)
异常通知(AfterThrowing)
最终通知(After)
环绕通知(Around)
⑥ 织⼊(Weaving):AOP实现的过程,即将切⾯应⽤到⽬标对象,从⽽创建⼀个新的代理对象的过程,织⼊可以在编译时,类加载时和运⾏时完成。对于Spring来说,就是初始化Context中的对象时,完成织⼊操作。
四. RabbitMQ 集成Spring Boot 2.4
1. ⽇志记录使⽤的消息模型为(Topics 通配符模式(交换机类型:topics))
2. 每个消费者监听⾃⼰的队列,并且设置带通配符的routingkey,⽣产者将消息发给broker,由交换机根据routingkey来转发消息到指
定的队列。
Routingkey⼀般都是有⼀个或者多个单词组成,多个单词之间以“.”分割,例如:hange
通配符规则:
#:匹配⼀个或多个词
*:匹配不多不少恰好1个词
3. RabbitMQ + SpringAOP ⽇志记录代码(部分)
RabbitMq 配置类
@Configuration
public class TopicMQConfig {
// 配置操作⽇志队列
public final static String OPERATE_LOG_QUEUE_NAME ="operate.log.queue";
// 路由的交换机
public final static String TOPIC_EXCHANGE_NAME ="hange";
// 配置操作⽇志TOPIC,#可以匹配多个
public final static String OPERATE_LOG_TOPIC ="topic.operateLog.#";
/**
* @Title: topicExchange
* @Description: 配置 TopicExchange Topic类型的交换机
*/
@Bean
public TopicExchange topicExchange(){
return new TopicExchange(TOPIC_EXCHANGE_NAME);
}
/**
* @Title: operateLogQueue
* @Description: 配置 operateLogQueue 操作⽇志队列
*/
@Bean
public Queue operateLogQueue(){
return new Queue(OPERATE_LOG_QUEUE_NAME);
}
/**
* @Title: operateLogBinding
spring aop应用场景* @Description: 将操作⽇志队列绑定到TOPIC_EXCHANGE_NAME交换机,并且匹配规则为匹配多个
*/
@Bean
public Binding operateLogBinding(){
return BindingBuilder.bind(operateLogQueue()).to(topicExchange()).with(OPERATE_LOG_TOPIC);
}
}
⽣产者部分:
// 发消息队列
消费者部分:
@RabbitListener(queues ={TopicMQConfig.OPERATE_LOG_QUEUE_NAME}, containerFactory ="rabbitListenerContainerFactory")
@RabbitHandler
public void insertLog(SysOperationLog sysOperationLog){
if(sysOperationLog !=null){
sysOperationLogService.saveOperationLog(sysOperationLog);
log.info("接收到消息:{}",sysOperationLog);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论