spring随笔(二) AOP(四)

2014-11-24 02:22:06 · 作者: · 浏览: 2
erviceImpl......save..."+customer.getName()); if(new Random().nextInt(10)>5){ throw new RuntimeException("保存失败....."); } }

这样就可以出现抛出异常的情况。没有异常的打印结果如下:

目标类:com.xiaohui.aop.CustomerServiceImpl
参数: [com.xiaohui.aop.Customer@1700391]
方法: save
session.brgintranscation()........
CustomerServiceImpl......save...张珊
session.getTranscation().commit()
session.close()

有异常抛出的打印结果如下:(在测试的过程中发现如果在切面类中将最终通知的方法 定义在 异常通知的方法 上面,则会先打印session.close(),后打印session.rollback....,有点不解)
目标类:com.xiaohui.aop.CustomerServiceImpl
参数: [com.xiaohui.aop.Customer@118223d]
方法: save
session.brgintranscation()........
CustomerServiceImpl......save...张珊
出现异常......保存失败.....
session.rollback....
session.close()
出过这几个通知外,还有一个环绕通知:@Around("execution(* com.xiaohui.aop.*ServiceImpl.*(..))") TransCationService切面类:
package com.xiaohui.aop;
import java.util.Arrays;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class TransCationService {
	public void pointcut() {
	}

	public void beginTranscation(JoinPoint jp) {
		System.out.println("目标类:" + jp.getTarget().getClass().getName());
		System.out.println("参数: " + Arrays.toString(jp.getArgs()));
		System.out.println("方法: " + jp.getSignature().getName());
		System.out.println("session.brgintranscation()........");
	}

	public void commit() {
		System.out.println("session.getTranscation().commit()");
	}

	public void closeSession() {
		System.out.println("session.close()");
	}

	public void rollback(Throwable e) {
		System.out.println("出现异常......" + e.getMessage());
		System.out.println("session.rollback....");
	}

	@Around("execution(* com.xiaohui.aop.*ServiceImpl.*(..))")
	public Object around(ProceedingJoinPoint point) {
		this.beginTranscation(point);
		try {
			Object obj = point.proceed();
			this.commit();
			return obj;
		} catch (Throwable t) {
			this.rollback(t);
		} finally {
			this.closeSession();
		}
		return null;
	}
}

测试的结果和上面的测试结果一致。

4,在applicationContext.xml中使用aop命名空间配置代理。

xml中同样需要引入aop的命名空间。但这次不需要打开

同样,也不需要使用注解来声明切面类和使用advice声明方法。

xml中配置如下

   

   

	
     
      
      
      
       
       
       
       
      
    
	
    
	
    
	
    
	
    

   


测试代码和ICustomerService接口以及CustomerServiceImpl类都和3中的一样,至于TransCationService,有无注解都没关系,因为在xml中 没有开启 ,所以不影响测试。

测试结果也和上面3中的一致。遇到同样的问题是在xml中配置 之后时打印结果顺序和配置他的顺序一致,有所不解。 before无论位置在哪都先执行没问题。