一、Spring配置檔案
<!--通過@AspectJ註解的形式來使用Spring AOP,強制使用CGLIB代理--> <aop:aspectj-autoproxy proxy-target-class="true"/>
上面這個配置的目的是告知Spring,我們將使用Annotation註解(比如:@Aspect、@Before、@After、@AfterReturning等)的方式來使用Spring AOP。
二、定義方面類(aspect)
package aop; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; /** * 定義一個方面(Aspect),Maven需要引用spring-aspects * 這個方面(Aspect)包括了多個增加處理(通知,比如:前置、後置、後置返回、異常等) * * @author xfyou * @date 2018/9/29 */ @Aspect @Component public class Advice { @Before(value = "execution(* bean.*.*(..)) && args(arg0)", argNames = "arg0") public void beforeAdvice(String arg0) { System.out.println("arg0=" + arg0); } @AfterReturning(pointcut = "execution(* bean.*.*(..))", returning = "retVal") public void afterReturnAdvice(String retVal) { System.out.println("fristName=" + retVal); } @AfterThrowing(pointcut = "execution(* bean.*.*(..))", throwing = "ex") public void afterThrowingAdvice(Exception ex) { System.err.println(ex.getMessage()); } }
上面分別定義了三個“前置”、“後置返回”、“異常”增強處理(或者叫著:通知)方法。通過@Aspect標註的Advice類必須註冊到Spring容器中才能使用,所以我們這裡使用到了一個@Component註解讓Spring能夠自動掃描並註冊到Spring容器中。
三、測試
package bean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author xfyou * @date 2018/9/6 */ public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml"); Person person = context.getBean(Person.class); person.setFirstName("frank"); person.getFirstName(); person.test(); } }
輸出如下:
beforeAdvice,arg0=frank afterReturnAdvice,retVal=frank afterThrowingAdvice,exception:RuntimeException Exception in thread "main" java.lang.RuntimeException: RuntimeException at bean.Person.test(Person.java:18) at bean.Person$$FastClassBySpringCGLIB$$40dc9373.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)