<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层直接使用自定义注解