一、使用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>