商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

基于@AspectJ配置Spring AOP(之二)

绑定代理对象
使用this()或target()可绑定被代理对象实例,在通过类实例名绑定对象时,还依然具有原来连接点匹配的功能,只不过类名是通过增强方法中同名入参的类型间接决定罢了。这里我们通过this()来了解对象绑定的用法:
package com.baobaotao.aspectj.advanced;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import com.baobaotao.Waiter;
@Aspect
public class TestAspect {
@Before("this(waiter)") ①通过②处查找出waiter对应的类型为Waiter,因而切点表达式
为this(Waiter),当增强方法织入目标连接点时,增强方法通过waiter
入参可以引用到代理对象的实例。
public void bindProxyObj(Waiter waiter){ ②
System.out.println("----bindProxyObj()----");
System.out.println(waiter.getClass().getName());
System.out.println("----bindProxyObj()----");
}
}
①处的切点表达式首先按类变量名查找②处增强方法的入参列表,进而获取类变量名对应的类为com.baobaotao.Waiter,这样就知道了切点的定义为this(com.baobaotao.Waiter),即所有代理对象为Waiter类的所有方法匹配该切点。②处的增强方法通过waiter入参绑定目标对象。
可见NaiveWaiter的所有方法匹配①处的切点,运行以下的测试代码:
String configPath = "com/baobaotao/aspectj/advanced/beans.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
Waiter naiveWaiter = (Waiter) ctx.getBean("naiveWaiter");
naiveWaiter.greetTo("John");
可以看到如下的输出信息:
----bindProxyObj()----
com.baobaotao.NaiveWaiter$$EnhancerByCGLIB$$6758891b
----bindProxyObj()----
NaiveWaiter:greet to John...
以按相似的方法使用target()进行绑定。
绑定类注解对象
@within()和@target()函数可以将目标类的注解对象绑定到增强方法中,我们通过@within()演示注解绑定的操作:
package com.baobaotao.aspectj.advanced;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import com.baobaotao.Monitorable;
@Aspect
public class TestAspect {
@Before("@within(m)") ①通过②处查找出m对应Monitorable类型的注解,
因而真实的切点表达式为@within (Monitorable),当增强方法织入目标
连接点时,增强方法通过m入参可以引用到连接点处的注解对象。
public void bindTypeAnnoObject(Monitorable m){ ②
System.out.println("----bindTypeAnnoObject()----");
System.out.println(m.getClass().getName());
System.out.println("----bindTypeAnnoObject()----");
}
}
NaiveWaiter类中标注了@Monitorable注解,所有NaiveWaiter Bean匹配切点,其Monitorable注解对象将绑定到增强方法中。运行以下代码,我们即可以查看到绑定注解对象:
String configPath = "com/baobaotao/aspectj/advanced/beans.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
Waiter naiveWaiter = (Waiter) ctx.getBean("naiveWaiter");
((NaiveWaiter)naiveWaiter).greetTo("John");
运行以上代码,输出以下信息:
----bindTypeAnnoObject()----
$Proxy3
----bindTypeAnnoObject()----
NaiveWaiter:greet to John...
从输出信息中,我们还发现了一个秘密,即使用CGLib代理NaiveWaiter时,其类的注解Monitorable对象也被代理了。
1 2 3 4 5 6
【内容导航】
第1页: 切点复合运算 第2页: 命名切点
第3页: 第3页 第4页: 第4页
第5页: 第5页 第6页: 第6页
©版权所有。未经许可,不得转载。
[责任编辑:赵恒]