接下來會分幾次透徹的介紹面向切面編程
MethodInterCeptor(方法攔截器)
//實現MethodInterceptor接口,並且spring管理當前類 @Component("controllerMethodInterceptor1") public class ControllerMethodInterceptor implements MethodInterceptor{ //重寫invoke方法,methodin爲攔截的方法,其中包含該方法的各種參數 @Override public Object invoke(MethodInvocation methodin) throws Throwable { System.out.println("攔截器開始"); //執行方法獲取結果 Object result = methodin.proceed(); System.out.println("攔截器結束"); return result; } }
然後把攔截類放入BeanNameAutoProxyCreator(此類是對方法攔截器的管理)
@Component //繼承BeanNameAutoProxyCreator,實現InitializingBean是爲了在spring初始化這個類的時候,會執行父類setBeanNames和setInterceptorNames把切哪裏和執行哪個攔截器帶入BeanNameAutoProxyCreator類 public class AllMethodInterceptor extends BeanNameAutoProxyCreator implements InitializingBean{ private static final long serialVersionUID = 1L; @Override public void afterPropertiesSet() throws Exception { super.setBeanNames(new String[]{"*Service"});//切任何結尾爲Service類的方法 super.setInterceptorNames(new String[]{"controllerMethodInterceptor1"}); //執行beanId爲controllerMethodInterceptor1的攔截器 } }
或者另一種方式把BeanNameAutoProxyCreator配置在XML中
<bean id="serviceInteceptorProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="interceptorNames"> <list> <!-- 放入攔截器類的BeanID --> <value>controllerMethodInterceptor1</value> </list> </property> <property name="beanNames"> <!-- 定義攔截範圍 --> <value>*Service</value> </property> </bean>