JoinPoint的用法

JoinPoint 对象

JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象. 
常用api:

方法名功能
Signature getSignature();获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
Object[] getArgs();获取传入目标方法的参数对象
Object getTarget();获取被代理的对象
Object getThis();获取代理对象

ProceedingJoinPoint对象

ProceedingJoinPoint对象是JoinPoint的子接口,该对象只用在@Around的切面方法中, 
添加了 
Object proceed() throws Throwable //执行目标方法 
Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法 
两个方法.

Demo

切面类

 
  1. @Aspect

  2. @Component

  3. public class aopAspect {

  4. /**

  5. * 定义一个切入点表达式,用来确定哪些类需要代理

  6. * execution(* aopdemo.*.*(..))代表aopdemo包下所有类的所有方法都会被代理

  7. */

  8. @Pointcut("execution(* aopdemo.*.*(..))")

  9. public void declareJoinPointerExpression() {}

  10.  
  11. /**

  12. * 前置方法,在目标方法执行前执行

  13. * @param joinPoint 封装了代理方法信息的对象,若用不到则可以忽略不写

  14. */

  15. @Before("declareJoinPointerExpression()")

  16. public void beforeMethod(JoinPoint joinPoint){

  17. System.out.println("目标方法名为:" + joinPoint.getSignature().getName());

  18. System.out.println("目标方法所属类的简单类名:" + joinPoint.getSignature().getDeclaringType().getSimpleName());

  19. System.out.println("目标方法所属类的类名:" + joinPoint.getSignature().getDeclaringTypeName());

  20. System.out.println("目标方法声明类型:" + Modifier.toString(joinPoint.getSignature().getModifiers()));

  21. //获取传入目标方法的参数

  22. Object[] args = joinPoint.getArgs();

  23. for (int i = 0; i < args.length; i++) {

  24. System.out.println("第" + (i+1) + "个参数为:" + args[i]);

  25. }

  26. System.out.println("被代理的对象:" + joinPoint.getTarget());

  27. System.out.println("代理对象自己:" + joinPoint.getThis());

  28. }

  29.  
  30. /**

  31. * 环绕方法,可自定义目标方法执行的时机

  32. * @param pjd JoinPoint的子接口,添加了

  33. * Object proceed() throws Throwable 执行目标方法

  34. * Object proceed(Object[] var1) throws Throwable 传入的新的参数去执行目标方法

  35. * 两个方法

  36. * @return 此方法需要返回值,返回值视为目标方法的返回值

  37. */

  38. @Around("declareJoinPointerExpression()")

  39. public Object aroundMethod(ProceedingJoinPoint pjd){

  40. Object result = null;

  41.  
  42. try {

  43. //前置通知

  44. System.out.println("目标方法执行前...");

  45. //执行目标方法

  46. //result = pjd.proeed();

  47. //用新的参数值执行目标方法

  48. result = pjd.proceed(new Object[]{"newSpring","newAop"});

  49. //返回通知

  50. System.out.println("目标方法返回结果后...");

  51. } catch (Throwable e) {

  52. //异常通知

  53. System.out.println("执行目标方法异常后...");

  54. throw new RuntimeException(e);

  55. }

  56. //后置通知

  57. System.out.println("目标方法执行后...");

  58.  
  59. return result;

  60. }

  61. }

被代理类

 
  1. /**

  2. * 被代理对象

  3. */

  4. @Component

  5. public class TargetClass {

  6. /**

  7. * 拼接两个字符串

  8. */

  9. public String joint(String str1, String str2) {

  10. return str1 + "+" + str2;

  11. }

  12. }

测试类

 
  1. public class TestAop {

  2. @Test

  3. public void testAOP() {

  4. //1、创建Spring的IOC的容器

  5. ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:bean.xml");

  6.  
  7. //2、从IOC容器中获取bean的实例

  8. TargetClass targetClass = (TargetClass) ctx.getBean("targetClass");

  9.  
  10. //3、使用bean

  11. String result = targetClass.joint("spring","aop");

  12. System.out.println("result:" + result);

  13. }

  14. }

输出结果

 
  1. 目标方法执行前...

  2. 目标方法名为:joint

  3. 目标方法所属类的简单类名:TargetClass

  4. 目标方法所属类的类名:aopdemo.TargetClass

  5. 目标方法声明类型:public

  6. 第1个参数为:newSpring

  7. 第2个参数为:newAop

  8. 被代理的对象:aopdemo.TargetClass@4efc180e

  9. 代理对象自己:aopdemo.TargetClass@4efc180e

  10. 目标方法返回结果后...

  11. 目标方法执行后...

  12. result:newSpring+newAop

参考文章: 
http://blog.csdn.net/ochangwen/article/details/52557724 
http://blog.csdn.net/a9529lty/article/details/7031070

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值