概述
需要对某些 service 方法添加日志和监控报警. 找了好长时间, 添加过程如下:
- 编写
@LogAndWarn注解 - 编写拦截器
LogAndWarnInterceptor - 编写切入点配置
LogAndWarnAdviser - 在对应 Service 类或方法加上
@LogAndWarn注解, 并测试
编写 @LogAndWarn 注解代码
1@Target({ ElementType.TYPE, ElementType.METHOD }) 2@Retention(RetentionPolicy.RUNTIME) 3public @interface LogAndWarn { 4 5}
编写 LogAndWarnInterceptor 拦截器代码
1import org.aopalliance.intercept.MethodInterceptor; 2 3@Component 4public class LogAndWarnInterceptor implements MethodInterceptor { 5 6 @Override 7 public Object invoke(MethodInvocation invocation) throws Throwable { 8 System.out.println("#### before method"); 9 Object retVal = invocation.proceed(); 10 System.out.println("#### after method"); 11 return retVal; 12 } 13 14} 15 16
注: 此示例代码并没有实现具体逻辑, 详细实现可以参考: https://my.oschina.net/u/1169457/blog/1489767
编写 LogAndWarnAdviser 切入点配置代码
1@Component 2public class LogAndWarnAdviser extends AbstractPointcutAdvisor { 3 4 private static final long serialVersionUID = 1L; 5 6 @Autowired 7 private LogAndWarnInterceptor interceptor; 8 9 private final StaticMethodMatcherPointcut pointcut = new StaticMethodMatcherPointcut() { 10 @Override 11 public boolean matches(Method method, Class<?> targetClass) { 12 return method.isAnnotationPresent(LogAndWarn.class) || targetClass.isAnnotationPresent(LogAndWarn.class); 13 } 14 }; 15 16 @Override 17 public Pointcut getPointcut() { 18 return this.pointcut; 19 } 20 21 @Override 22 public Advice getAdvice() { 23 return this.interceptor; 24 } 25 26}
编写 service 代码, 查看执行结果
service简单这么写:
1 @LogAndWarn 2 public void test(){ 3 System.out.println("###### test..."); 4 }
通过 http 请求调用 controller 再调用 service 方法, 控制台输出如下:
1#### before method 2###### test... 3#### after method
参考:
http://blog.javaforge.net/post/76125490725/spring-aop-method-interceptor-annotation
http://todayleave.blogspot.jp/2016/02/spring-methodinterceptor.html https://my.oschina.net/u/1169457/blog/1489767