每一个你不满意的现在,都有一个你不努力的曾经. 网站首页 > 其他
springboot AspectJ 和自定义@annotation
发布时间:2018-12-27 10:07:37 修改时间:2018-12-27 10:07:37 阅读:5371 评论:0 0
- 在springboot中不需要显示的开启aspect功能。
- 通过@Aspect标记的类就会被认为是一个切面。通过@Component注解,该类就会被springboot扫描装配。
- 通过@Pointcut注解定义切点,给需要给增加日志功能的目标类,匹配的类名和方法名。
- 通过@Before(通知方法会在目标方法运行之前执行),@AfterReturning(通知方法会在目标方法返回(结束)后调用)、@AfterThrowing(通知方法会在目标方法异常后调用)、@Around(环绕通知)注解对把需要操作的代码植入到目标方法中。
版本:springboot 2.0.4.RELEASE。
业务需求:给所有的service加上日志操作。
aspect jar包:springboot2中不需要显示的引用aop和aspect的jar包。
@Aspect
@Component
public class LogInterceptor {
//定义切点的匹配路径
public final static String POINT_CUT ="execution(* com.example.service..*Service.* (..))";
//定义切点,需要使用该匹配切点的植入方法,可以通过方法名调用
@Pointcut(POINT_CUT)
public void logPointcut(){
}
//在目标类的方法执行后,获取目标类方法的详细信息
/ * @param joinPoint 可以获取执行方法的详细信息
* @param result 目标类执行后的返回值
*/
@AfterReturning(value = "logPointcut()",returning = "result")
public void logBefor(JoinPoint joinPoint , Object result){
Signature signature = joinPoint.getSignature();
System.out.println("方法名称 :"+signature.getName());
System.out.println("、执行的service :"+signature.getDeclaringTypeName());
System.out.println("getModifiers :"+signature.getModifiers());
System.out.println("类名。方法名 :"+signature.toLongString());
System.out.println("toShortString :"+signature.toShortString());
System.out.println("method return result :"+result);
}
}
可以在service上使用自定义注解,获取自定义的数据信息。配合JoinPoint可以获取目标方法的详细信息。
创建自定义注解:
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface Log {
String operation(); // 日志操作类型
String module(); // 所属模块
String detail(); // 日志内容
}
在切面中使用:
@Aspect
@Component
public class LogInterceptor {
public final static String POINT_CUT ="execution(* com.example.service..*Service.* (..))";
@Pointcut(POINT_CUT)
public void logPointcut(){
}
/**
* 通过自定义注解获取
* @param annotation
*/
@AfterReturning(value = "logPointcut() && @annotation(annotation) " ,argNames = "annotation")
public void logAfter(Log annotation){
/**
* 获取注解中的参数。
*/
String detail = annotation.detail();
String operation = annotation.operation();
String module = annotation.module();
System.out.println("-----logAfter");
}
}
在service中使用:
@Log(operation = "aa",module = "测试",detail = "cecece")
public String login() {
......
}
回复列表
关键字词:span,style,color,rgb,margin-left,40px