Spring的AOP:参数操作

来源:互联网 发布:天策脸型数据 编辑:程序博客网 时间:2024/06/15 12:35
       在最近的研究中关于Spring的AOP:参数操作,用于获取JoinPoint的信息。

获取目标方法的信息

    

访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,JoinPoint是SpringAoP中,只支持Method Execution (方法执行)的Joinpoint,对于类型中的属性,我们可以通过对setter,getter方法的拦截从而达到相同的效果。


JoinPoint里包含了如下几个常用的方法:

Object[]     getArgs:         返回目标方法的参数
Signature  getSignature: 返回目标方法的签名
Object       getTarget:      返回被织入增强处理的目标对象

Object       getThis:          返回AOP框架为目标对象生成的代理对象


注意:当使用@Around处理时,我们需要将第一个参数定义为ProceedingJoinPoint类型,该类是JoinPoint的子类。

        下面的切面类中定义了Before、Around、AfterReturning和After 4中增强处理,并分别在4种增强处理中访问被织入增强处理的目标方法、目标方法的参数和被织入增强处理的目标对象等:

@Aspect@Componentpublic class AdviceArg {// 定义切点表达式@Pointcut("execution(* com.baowei.dao.*.*(..))")public void pointCut_() {}@Around("pointCut_()")public Object process(ProceedingJoinPoint point) throws Throwable {System.out.println("@Around:执行目标方法之前...");// 访问目标方法的参数:Object[] args = point.getArgs();if (args != null && args.length > 0&& args[0].getClass() == String.class) {args[0] = "改变后的参数1";}// 用改变后的参数执行目标方法Object returnValue = point.proceed(args);System.out.println("@Around:执行目标方法之后...");System.out.println("@Around:被织入的目标对象为:" + point.getTarget());return returnValue;}@Before("pointCut_()")public void permissionCheck(JoinPoint point) {System.out.println("@Before:模拟权限检查...");System.out.println("@Before:目标方法为:"+ point.getSignature().getDeclaringTypeName() + ".--"+ point.getSignature().getName());System.out.println("@Before:参数为:" + Arrays.toString(point.getArgs()));System.out.println("@Before:被织入的目标对象为:" + point.getTarget());}@AfterReturning(pointcut = "pointCut_()", returning = "returnValue")public void log(JoinPoint point, Object returnValue) {System.out.println("@AfterReturning:模拟日志记录功能...");System.out.println("@AfterReturning:目标方法为:"+ point.getSignature().getDeclaringTypeName() + "."+ point.getSignature().getName());System.out.println("@AfterReturning:参数为:"+ Arrays.toString(point.getArgs()));System.out.println("@AfterReturning:返回值为:" + returnValue);System.out.println("@AfterReturning:被织入的目标对象为:" + point.getTarget());}@After("pointCut_()")public void releaseResource(JoinPoint point) {System.out.println("@After:模拟释放资源...");System.out.println("@After:目标方法为:"+ point.getSignature().getDeclaringTypeName() + "."+ point.getSignature().getName());System.out.println("@After:参数为:" + Arrays.toString(point.getArgs()));System.out.println("@After:被织入的目标对象为:" + point.getTarget());}}

测试代码:

public class UserTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");UserService service = context.getBean(UserService.class);System.out.println(service);User user = service.getUser(1);System.out.println(user);}}

下面是执行结果:

@Around:执行目标方法之前...@Before:模拟权限检查...@Before:目标方法为:com.baowei.dao.UserDao.--getUser@Before:参数为:[1]@Before:被织入的目标对象为:com.baowei.dao.UserDao@21ed5459get User ...@Around:执行目标方法之后...@Around:被织入的目标对象为:com.baowei.dao.UserDao@21ed5459@After:模拟释放资源...@After:目标方法为:com.baowei.dao.UserDao.getUser@After:参数为:[1]@After:被织入的目标对象为:com.baowei.dao.UserDao@21ed5459@AfterReturning:模拟日志记录功能...@AfterReturning:目标方法为:com.baowei.dao.UserDao.getUser@AfterReturning:参数为:[1]@AfterReturning:返回值为:User [id=1, name=zhang]@AfterReturning:被织入的目标对象为:com.baowei.dao.UserDao@21ed5459User [id=1, name=zhang]


源码下载地址:

http://download.csdn.net/detail/zbw18297786698/9684416

原博客地址:

http://blog.csdn.net/xvshu/article/details/45112675


1 0