須要對某些 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