【Spring 】【AOP】XML開發
一、使用AOP進行單元測試
1.引入jar包
2.引入xml提示(為XML AOP做準備,可有可無)
http://www.springframework.org/schema/aop/spring-aop.xsd
在window->preference->輸入xml,找到xml catalog-->add,url填上面那個,選擇filesystem,選對應的.xsd檔案
3.新增測試類,添加註解
package com.testSpring.AOP.test; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.testSpring.AOP.Dao.UserDao; //使用AOP的單元測試 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:app.xml") public class demo1 { @Resource(name="UserDao")//注入待測物件 private UserDao user; @Test public void test1() { /*ApplicationContext context = new ClassPathXmlApplicationContext("app.xml"); UserDao user = (UserDao)context.getBean("UserDao"); user*/ //測試物件方法 user.delete(); user.update(); user.query(); user.add(); } }
4.執行測試(快捷鍵 alt+shift +x,t)
二、AOP 的xml開發
0.必要知識
專業用語:切入點,織入,
通知型別:
0.1.前置通知
獲得切入點資訊
public static void getMD5(JoinPoint joinpoint) { String methodName = joinpoint.getSignature().getName(); List<Object> args = Arrays.asList(joinpoint.getArgs()); System.out.println("The method " + methodName + " begins with " + args); }
<aop:config>
<aop:pointcut expression="execution(* com.testSpring.AOP.Dao.UserDao.add(int))" id="pointCut1"/>
<aop:aspect ref="MD5Utils">
<aop:before method="getMD5" pointcut-ref="pointCut1" arg-names="joinpoint"/>
</aop:aspect>
</aop:config>
0.2後置通知
//被增強方法示例
public String update() {
System.out.println("update method excuting ....");
return "update string";
}
//增強方法
public static void getMD5Del(Object result) {
System.out.println("被增強方法的返回值是" + result);
}
//xml中的配置:
<aop:config>
<aop:pointcut expression="execution(* com.testSpring.AOP.Dao.UserDao.delete(..)))" id="pointCut2"/>
<aop:aspect ref="MD5Utils">
<aop:after-returning method="getMD5Del" pointcut-ref="pointCut2" returning="result"/>
</aop:aspect>
</aop:config>
0.3環繞通知
//要增強的方法
public String update() {
System.out.println("update method excuting ....");
return "update string";
}
//增強方法
public static void getMD5Up(ProceedingJoinPoint joinpoint) throws Throwable {
System.out.println("around before");
Object obj = joinpoint.proceed();
System.out.println("return value is" + (String)obj);
System.out.println("around after");
}
//XML中的配置
<aop:config>
<aop:pointcut expression="execution(* com.testSpring.AOP.Dao.UserDao.update(..)))" id="pointCut3"/>
<aop:aspect ref="MD5Utils">
<aop:around method="getMD5Up" pointcut-ref="pointCut3"/>
</aop:aspect>
</aop:config>
0.4異常丟擲通知
//配置增強方法
public static void throwEx(Exception ex) {
System.out.println("ex");
}
//XML中的配置
<aop:config>
<aop:pointcut expression="execution(* com.testSpring.AOP.Dao.UserDao.query(..)))" id="pointCut4"/>
<aop:aspect ref="MD5Utils">
<aop:after-throwing method="throwEx" pointcut-ref="pointCut4" throwing="ex"/>
</aop:aspect>
</aop:config>
0.5最終通知
//增強方法
public static void finallyRun() {
System.out.println("最終通知");
}
//XML中的配置
<aop:after method="finallyRun" pointcut-ref="pointCut4"/>
0.6引介通知
1.編寫切面類
2.配置xml
步驟:首先配置bean,要增強的類,和增強類。配置切面配置aop:config,加入切入點aop:pointcut.expression中的符號*是任意返回值,..是入參。最後是切面引用,ref引用增強類,什麼時候增強,aop:before|after|around,切入點引用 point-cut,要增強的方法method.
<bean id="UserDao" class="com.testSpring.AOP.Dao.UserDao"></bean>
<bean id="MD5Utils" class="com.testSpring.AOP.Utils.MD5Utils"></bean>
<aop:config>
<aop:pointcut expression="execution(* com.testSpring.AOP.Dao.UserDao.add(..))" id="pointCut1"/>
<aop:aspect ref="MD5Utils">
<aop:before method="getMD5()" pointcut-ref="pointCut1"/>
</aop:aspect>
</aop:config>