aop的简单使用

最近项目中,需要请求每个service方法都传一个rabbitMq的exchange,该exchange是instanceEntity的一个属性,所以选择了aop

aop通知定义

import com.alibaba.fastjson.JSONObject;
import com.cloud.rds.instancefactory.config.RabbitMQConfig;
import com.cloud.rds.instancefactory.constant.ConfigConstants;
import com.cloud.rds.instancefactory.entity.InstanceEntity;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

/**
 * author yulinshan
 * time 2019/5/25
 **/
@Aspect
@Component
public class ExchangeAop {

    private Logger logger = LoggerFactory.getLogger(ExchangeAop.class);
    @Autowired
    RabbitMQConfig rabbitMQConfig;

    /**
     * 定义切入点,切入点为com.cloud.rds.instancefactory.service.impl.InstanceServiceImpl类下的所有函数
     */
    @Pointcut("execution(public * com.inspur.cloud.rds.instancefactory.service.impl.InstanceServiceImpl*.*(..))")
    public void ExchangePointcut(){}

    /**
     * 前置通知:在切入点之前执行的通知
     * @param joinPoint
     * @throws Throwable
     */
    @Before(value = "ExchangePointcut()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
        Object[] objList = joinPoint.getArgs();//拿到被切方法的所以参数对象
        for (Object o : objList){
            if (o instanceof InstanceEntity){//判断该参数是否属于instanceEntity类型
                InstanceEntity instanceEntity = (InstanceEntity)o;
                logger.info("exchange is "+ instanceEntity.getExchange());
                setDeclareExchange(instanceEntity.getExchange());//设置为Exchange
                break;
            }
        }

    }

    public void setDeclareExchange(String exchange){
        if (null == exchange ||  "".equals(exchange) ){
            exchange = ConfigConstants.MQ_EXCHANGE;
        }
        ConnectionFactory connectionFactory = rabbitMQConfig.getConnectionFactory();//获得connectionFactory对象,该方法主要是通过rabbitMq的ip,port,userName,paword去连接rabbitMq,从而获得一个connectFactory对象
        TopicExchange topicExchange = new TopicExchange(exchange);
        RabbitAdmin admin = new RabbitAdmin(connectionFactory);
        admin.declareExchange(topicExchange);//声明式方式创建Exchange(有则不创建,无则创建)
    }

}

instanceEntity类如下

package com.cloud.rds.instancefactory.entity;
import java.util.UUID;

public class InstanceEntity {
   private UUID requestId = UUID.randomUUID();
   private String exchange;

   public String getExchange() {
      return exchange;
   }

   public void setExchange(String exchange) {
      this.exchange = exchange;
   }

   public String getResourcePath() {
      return resourcePath;
   }

  

   public UUID getRequestId() {
      return requestId;
   }

   public void setRequestId(UUID requestId) {
      this.requestId = requestId;
   }

JoinPoint供了大量的被切方法相关的方法。

你可能感兴趣的:(aop的简单使用)