访问目标方法最简单的做法是定义增强处理方法时将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强的连接点。JoinPOINT里包含了如下几个常用的方法:
1) Object[] getArgs():返回执行目标方法时的参数
2) Sifnature getSignature():返回被增强的方法的相关信息
3) Object getTarget():返回被织入增强处理的目标对象
4) Object getThis():返回AOP框架为目标对象生成的代理对象
下面的例子,笔者定义了Before、Around、AfterReturning、After四种增强处理,并分别在4种处理中被织入增强处理的目标方法、执行目标方法的参数、被织入增强处理的目标对象等。(类名为FourAdviceTest.java)
// 定义一个切面
@Aspect
public class FourAdviceTest
{
// 定义Around增强处理
@Around("execution(* com.owen.app.service.impl.*.*(..))")
public Object processTx(ProceedingJoinPoint jp)
throws java.lang.Throwable
{
System.out.println("Around增强:执行目标方法之前,模拟开始事务...");
// 访问执行目标方法的参数
Object[] args = jp.getArgs();
// 当执行目标方法的参数存在,
// 且第一个参数是字符串参数
if (args != null && args.length > 0
&& args[0].getClass() == String.class)
{
// 修改目标方法调用参数的第一个参数
args[0] = "【增加的前缀】" + args[0];
}
//执行目标方法,并保存目标方法执行后的返回值
Object rvt = jp.proceed(args);
System.out.println("Around增强:执行目标方法之后,模拟结束事务...");
// 如果rvt的类型是Integer,将rvt改为它的平方
if(rvt != null && rvt instanceof Integer)
rvt = (Integer)rvt * (Integer)rvt;
return rvt;
}
// 定义Before增强处理
@Before("execution(*com.owen.app.service.impl.*.*(..))")
public void authority(JoinPoint jp)
{
System.out.println("Before增强:模拟执行权限检查");
// 返回被织入增强处理的目标方法
System.out.println("Before增强:被织入增强处理的目标方法为:"
+ jp.getSignature().getName());
// 访问执行目标方法的参数
System.out.println("Before增强:目标方法的参数为:"
+ Arrays.toString(jp.getArgs()));
// 访问被增强处理的目标对象
System.out.println("Before增强:被织入增强处理的目标对象为:"
+ jp.getTarget());
}
//定义AfterReturning增强处理
@AfterReturning(pointcut="execution(*com.owen.app.service.impl.*.*(..))"
, returning="rvt")
public void log(JoinPoint jp , Object rvt)
{
System.out.println("AfterReturning增强:获取目标方法返回值:"
+ rvt);
System.out.println("AfterReturning增强:模拟记录日志功能...");
// 返回被织入增强处理的目标方法
System.out.println("AfterReturning增强:被织入增强处理的目标方法为:"
+ jp.getSignature().getName());
// 访问执行目标方法的参数
System.out.println("AfterReturning增强:目标方法的参数为:"
+ Arrays.toString(jp.getArgs()));
// 访问被增强处理的目标对象
System.out.println("AfterReturning增强:被织入增强处理的目标对象为:"
+ jp.getTarget());
}
// 定义After增强处理
@After("execution(*com.owen.app.service.impl.*.*(..))")
public void release(JoinPoint jp)
{
System.out.println("After增强:模拟方法结束后的释放资源...");
// 返回被织入增强处理的目标方法
System.out.println("After增强:被织入增强处理的目标方法为:"
+ jp.getSignature().getName());
// 访问执行目标方法的参数
System.out.println("After增强:目标方法的参数为:"
+ Arrays.toString(jp.getArgs()));
// 访问被增强处理的目标对象
System.out.println("After增强:被织入增强处理的目标对象为:"
+ jp.getTarget());
}
}
该应用的目标Bean类,依然是HelloImpl.java和WorldImple.java,这两个类与SpringAOP(一)Before增强处理中的类是一样的,这里就写出,读者可以到前面章节参考。执行主程序的结果如下。
[java] 信息:Loading XML bean definitions from class path resource…
[java]Around增强:执行目标方法之前,模拟开始事务….
[java]Before增强:模拟执行权限检查
[java]Before增强:被织入增强处理的目标方法为:foo
[java]Before增强:目标方法的参数为:[]
[java]Before增强:被织入增强处理的目标对象为:com.owen.app.service.ompl.
[java]执行Hello组件的foo()方法
[java]Around增强:执行目标方法之后,模拟结束事务…
[java]After增强:模拟方法结束后的释放资源…
[java]After增强:被织入增强处理的目标方法为:foo
[java]After增强:目标方法的参数为:[]
[java]After增强:被织入增强处理目标对象为:com.owen.app.service.impl.
[java]AfterReturning增强:获取目标方法返回值:null
[java] AfterReturning增强:模拟记录日志功能….
[java] AfterReturning增强:被织入增强处理的目标为:foo
[java] AfterReturning增强:目标方法的参数为:[]
[java] AfterReturning增强:被织入增强处理目标对象为:com.owen.app.service.impl.
通过上面的例子,可能发现:具有最高优先级的增强处理将先被织入。在”退出”连接点时,具有最高优先级的增强处理会最后被织入。