须要对某些 service 方法添加日志和监控报警. 找了好长时间, 添加过程以下:html
@LogAndWarn
注解LogAndWarnInterceptor
LogAndWarnAdviser
@LogAndWarn
注解, 并测试@Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface LogAndWarn { }
import org.aopalliance.intercept.MethodInterceptor; @Component public class LogAndWarnInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("#### before method"); Object retVal = invocation.proceed(); System.out.println("#### after method"); return retVal; } }
注: 此示例代码并无实现具体逻辑, 详细实现能够参考: http://www.javashuo.com/article/p-mhgbwhpf-bt.htmljava
@Component public class LogAndWarnAdviser extends AbstractPointcutAdvisor { private static final long serialVersionUID = 1L; @Autowired private LogAndWarnInterceptor interceptor; private final StaticMethodMatcherPointcut pointcut = new StaticMethodMatcherPointcut() { @Override public boolean matches(Method method, Class<?> targetClass) { return method.isAnnotationPresent(LogAndWarn.class) || targetClass.isAnnotationPresent(LogAndWarn.class); } }; @Override public Pointcut getPointcut() { return this.pointcut; } @Override public Advice getAdvice() { return this.interceptor; } }
service简单这么写:spring
@LogAndWarn public void test(){ System.out.println("###### test..."); }
经过 http 请求调用 controller 再调用 service 方法, 控制台输出以下:ide
#### before method ###### test... #### after method
http://blog.javaforge.net/post/76125490725/spring-aop-method-interceptor-annotation
http://todayleave.blogspot.jp/2016/02/spring-methodinterceptor.html http://www.javashuo.com/article/p-mhgbwhpf-bt.htmlpost