面向切面编程 @Aspect AOP aop 切面编程 aop编程 aspect

 

<dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjrt</artifactId>
          <version>1.8.13</version>
      </dependency>
<dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjweaver</artifactId>
   <version>1.8.3</version>
</dependency>

 

package com.hanhan.log;

import com.alibaba.fastjson.JSON;
import hanhan.p;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 日志记录
 *
 * @author fengshuonan
 * @date 2016年12月6日 下午8:48:30
 */

@Aspect
@Component
public class LogAop {

    private org.slf4j.Logger log= org.slf4j.LoggerFactory.getLogger(this.getClass());

    @Pointcut(value = "@annotation(com.hanhan.log.TestLog)")
    public void cutService() {

    }

    @Around("cutService()")
    public Object recordSysLog(ProceedingJoinPoint point) throws Throwable {
        p.p("%%%%%%%%%%%%%%%log start%%%%%%%%%%%%");
        //先执行业务
        Object result = point.proceed();

        try {
            handle(point);
        } catch (Exception e) {
            log.error("日志记录出错!", e);
        }
        p.p("%%%%%%%%%%%%%%%log end%%%%%%%%%%%%");
        return result;
    }

    private void handle(ProceedingJoinPoint point) throws Exception {

        //获取拦截的方法名
        Signature sig = point.getSignature();
        p.p("#sig#####"+sig+"#####");
        MethodSignature msig = null;
        if (!(sig instanceof MethodSignature)) {
            throw new IllegalArgumentException("该注解只能用于方法");
        }
        msig = (MethodSignature) sig;
        Object target = point.getTarget();
        Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
        p.p("#JSON.toJSONString(currentMethod)#####"+ JSON.toJSONString(currentMethod)+"#####");
        String methodName = currentMethod.getName();
        p.p("#methodName#####"+methodName+"#####");

        //如果当前用户未登录,不做日志
//        ShiroUser user = ShiroKit.getUser();
//        if (null == user) {
//            return;
//        }

        //获取拦截方法的参数
        String className = point.getTarget().getClass().getName();
        Object[] params = point.getArgs();

        //获取操作名称
        TestLog annotation = currentMethod.getAnnotation(TestLog.class);
        String bussinessName = annotation.value();
        String key = annotation.key();
//        Class dictClass = annotation.dict();

        StringBuilder sb = new StringBuilder();
        for (Object param : params) {
            sb.append(param);
            sb.append(" & ");
        }

//        //如果涉及到修改,比对变化
//        String msg;
//        if (bussinessName.contains("修改") || bussinessName.contains("编辑")) {
//            Object obj1 = LogObjectHolder.me().get();
//            Map<String, String> obj2 = HttpContext.getRequestParameters();
//            msg = Contrast.contrastObj(dictClass, key, obj1, obj2);
//        } else {
//            Map<String, String> parameters = HttpContext.getRequestParameters();
//            AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
//            msg = Contrast.parseMutiKey(dictMap, key, parameters);
//        }
//
//        LogManager.me().executeLog(LogTaskFactory.bussinessLog(user.getId(), bussinessName, className, methodName, msg));
    }
}

 

 

 

 

然后启动类上   @EnableAspectJAutoProxy

 

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication(scanBasePackages = {"com.hanhan","hanhan"})
@MapperScan({"com.hanhan.dao"})
@EnableScheduling
@EnableAspectJAutoProxy//这个是让@Aspect生效的东西
public class BeetltestApplication {


   public static void main(String[] args) {
      SpringApplication.run(BeetltestApplication.class, args);
   }
}

 

自定义注解

 

package com.hanhan.log;

import java.lang.annotation.*;

/**
 * 标记需要做业务日志的方法
 *
 * 
 * @date 2017-03-31 12:46
 */
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface TestLog {

    /**
     * 业务的名称,例如:"修改菜单"
     */
    String value() default "";

    /**
     * 被修改的实体的唯一标识,例如:菜单实体的唯一标识为"id"
     */
    String key() default "id";


}

在controller层直接使用自定义注解

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值