AspectJ是一個面向切面的框架,它擴展了Java語言。AspectJ定義了AOP語法,因此它有一個專門的編譯器用來生成遵照Java字節編碼規範的Class文件。html
AspectJ 是一個面向切面的框架!定義了AOP的語法!spring
Spring 將AspectJ 整合到了本身的框架中!express
須要引入兩個核心jar框架
01.aspectj.weaveride
02.spring-aspects測試
(若是你使用的是idea 所需的全部pom節點,在這兒:http://www.javashuo.com/article/p-kqshsgwm-dh.html)編碼
務必掌握的 AspectJ 的切入點表達式idea
execution([訪問權限類型] 返回值類型 [完整限定類名]方法名 (參數) [拋出的異常類型])spa
execution( 返回值類型 方法名(參數))代理
*:0-N的字符
..:
01.若是是在方法參數中,表示參數可有多個或者可無
02.若是是在包名以後,表示當前包和子包
+:
01.若是定義在類後面,表示當前類以及子類
02.若是定義在接口後面,表示當前接口以及實現類
例子:
/** * 當前類就是 整個程序中須要的各類系統級業務 * 就是一個切面類 */ @Aspect public class MyAspectJ { @Before("execution(* *..UserDao.sleep(..))") public void before(){ System.out.println("前置加強........"); } @AfterReturning("execution(* *..UserDao.sleep(..))") public void afterReturning(){ System.out.println("後置加強........"); } //若是想獲取方法的返回值 @AfterReturning(value = "execution(* *..UserDao.sleep(..))",returning = "result") public void afterReturning(String result){ System.out.println("後置加強........"+result); } /** * 環繞加強能夠改變返回值 */ @Around("execution(* *..UserDao.eat(..))") public Object around(ProceedingJoinPoint point){ System.out.println("環繞加強進來........"); Object result=null; try { result= point.proceed(); //執行目標方法 } catch (Throwable throwable) { throwable.printStackTrace(); } System.out.println("環繞加強出去........"); return "orange"; } }
<!--01.配置目標對象--> <bean id="userDao" class="com.xdf.dao.UserDaoImpl"/> <!--02.配置切面--> <bean id="myAspectJ" class="com.xdf.annotation.MyAspectJ"/> <!--03.註冊aspectj的自動代理--> <aop:aspectj-autoproxy/> //測試方法 @Test public void defaultTest(){ ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml"); UserDao dao= context.getBean("userDao", UserDao.class); // System.out.println(dao.eat()); dao.sleep(); }
public class MyAspectJ { public void before(){ System.out.println("前置加強........"); } public void afterReturning(){ System.out.println("後置加強........"); } /** * 環繞加強能夠改變返回值 */ public Object around(ProceedingJoinPoint point){ System.out.println("環繞加強進來........"); Object result=null; try { result= point.proceed(); //執行目標方法 } catch (Throwable throwable) { throwable.printStackTrace(); } System.out.println("環繞加強出去........"); return "orange"; } }
<!--01.配置目標對象--> <bean id="userDao" class="com.xdf.dao.UserDaoImpl"/> <!--02.配置切面--> <bean id="myAspectJ" class="com.xdf.annotation.MyAspectJ"/> <!--03.註冊aspectj須要的切入點--> <aop:config> <!--配置切入點表達式--> <aop:pointcut id="myPonit" expression="execution(* *..UserDao.sleep(..))"/> <aop:pointcut id="myPonit2" expression="execution(* *..UserDao.eat(..))"/> <!--配置切面--> <aop:aspect ref="myAspectJ"> <aop:before method="before" pointcut-ref="myPonit"/> <aop:after-returning method="afterReturning" pointcut-ref="myPonit"/> <aop:around method="around" pointcut-ref="myPonit2"/> </aop:aspect> </aop:config>
@Test public void aspectJTest(){ ApplicationContext context=new ClassPathXmlApplicationContext("aspectJ.xml"); UserDao dao= context.getBean("userDao", UserDao.class); //System.out.println(dao.eat()); dao.sleep(); }
未完待續!!!