- 浏览: 1516762 次
- 性别:
- 来自: 厦门
博客专栏
-
Spring 3.x企业实...
浏览量:461476
文章分类
最新评论
-
JyeChou:
学习Spring必学的Java基础知识(1)----反射 -
hhzhaoheng:
...
《Spring4.x企业应用开发实战》光盘资料下载 -
renlongnian:
//assertReflectionEquals(user1, ...
单元测试系列之3:测试整合之王Unitils -
骑着蜗牛超F1:
huang_yong 写道我的经验是,只需定义三层:1.ent ...
Spring的事务管理难点剖析(2):应用分层的迷惑 -
wangyudong:
工具地址貌似更新了哦https://github.com/Wi ...
几种常用的REST webservice客户端测试工具
Spring Reference对这两个切点标识符的用法描述得不太清楚:
似乎看不出两者的具体区别,我试着做了一个测试:
切面定义类:
目标类接口:
目标接口实现类:
然后是配置:
最后是测试:
输出以下信息:
将切点定义换成:
@Before("this(com.baobaotao.expression.Waiter)")
输出的效果是完全一样的。
我的分析:
我本来以为NaiveWaiter的foo()方法在使用@Before("target(com.baobaotao.expression.NaiveWaiter)")应该也可以织入切面,但是发现不管采用哪种方式只能为Waiter接口织入切面。
请问这两个切点表示符到底有什么区别,我现在看到的是两者好象完全一样。
引用
this - limits matching to join points (the execution of methods when using Spring AOP) where the bean
reference (Spring AOP proxy) is an instance of the given type
• target - limits matching to join points (the execution of methods when using Spring AOP) where the target
object (application object being proxied) is an instance of the given type
reference (Spring AOP proxy) is an instance of the given type
• target - limits matching to join points (the execution of methods when using Spring AOP) where the target
object (application object being proxied) is an instance of the given type
似乎看不出两者的具体区别,我试着做了一个测试:
切面定义类:
package com.baobaotao.expression; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class PreGreetingAspect{ @Before("target(com.baobaotao.expression.NaiveWaiter)") public void beforeGreeting(){ System.out.println("How are you"); } }
目标类接口:
package com.baobaotao.expression; public interface Waiter { public void greetTo(String name); public void serveTo(String name); }
目标接口实现类:
package com.baobaotao.expression; public class NaiveWaiter implements Waiter { public void greetTo(String name) { System.out.println("greet to "+name+"..."); } public void serveTo(String name){ System.out.println("serving "+name+"..."); foo(name); } public void foo(String name){ System.out.println("foo "+name+"..."); } }
然后是配置:
<aop:aspectj-autoproxy /> <bean id="waiter" class="com.baobaotao.expression.NaiveWaiter" /> <bean id="greetingAfter" class="com.baobaotao.expression.PreGreetingAspect" />
最后是测试:
package com.baobaotao.expression; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.baobaotao.expression.Waiter; public class TestExpression { public static void main(String[] args) { String configPath = "com/baobaotao/expression/beans.xml"; ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath); Waiter waiter = (Waiter)ctx.getBean("waiter"); waiter.greetTo("John"); waiter.serveTo("John"); } }
输出以下信息:
How are you greet to John... How are you serving John...
将切点定义换成:
@Before("this(com.baobaotao.expression.Waiter)")
输出的效果是完全一样的。
我的分析:
我本来以为NaiveWaiter的foo()方法在使用@Before("target(com.baobaotao.expression.NaiveWaiter)")应该也可以织入切面,但是发现不管采用哪种方式只能为Waiter接口织入切面。
请问这两个切点表示符到底有什么区别,我现在看到的是两者好象完全一样。
评论
10 楼
duckCaptain
2013-06-07
那个引入的也是这两个东西的不同之一。:D
9 楼
duckCaptain
2013-06-07
不知道是不是新版本的改进,在3.2 中,
@Before("this(main.com.fqs.differ.NaiveWaiter)")
是不会被代理的
而使用
@Before("target(main.com.fqs.differ.NaiveWaiter)")
是可以被代理的
@Before("this(main.com.fqs.differ.NaiveWaiter)")
是不会被代理的
而使用
@Before("target(main.com.fqs.differ.NaiveWaiter)")
是可以被代理的
8 楼
bzssyks
2007-06-19
顶楼主~~~
7 楼
stamen
2007-01-23
TMD,终于搞定了,是这样的:
@Before"this(com.baobaotao.Seller)"
void test(){}
表示这样的情况,某个目标类如 NaiveWaiter所生成的代理对象是Seller类型,则NaiveWaiter上的所有方法织入test()方法,这种情况一般用于引入增强的情况,引入可以为目标类添加某一个接口的实现,如:
为com.baobaotao.expression包下的所有类引入Seller接口的实现,这样代理对象就都是Seller类型了,因此
目标类的greetTo()方法就得不到增强了。
@Before"this(com.baobaotao.Seller)"
void test(){}
表示这样的情况,某个目标类如 NaiveWaiter所生成的代理对象是Seller类型,则NaiveWaiter上的所有方法织入test()方法,这种情况一般用于引入增强的情况,引入可以为目标类添加某一个接口的实现,如:
package com.baobaotao.expression; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.DeclareParents; @Aspect public class PreGreetingAspect { @DeclareParents(value = "com.baobaotao.expression.*", defaultImpl = GoodSeller.class) public static Seller seller; @Before(" execution(* greetTo(..)) && this(com.baobaotao.expression.Seller)") public void recordUsage() { System.out.println("Haha"); } }
为com.baobaotao.expression包下的所有类引入Seller接口的实现,这样代理对象就都是Seller类型了,因此
@Before(" execution(* greetTo(..)) && this(com.baobaotao.expression.Seller)")匹配目标类的所有greetTo()方法,这里,要是我们把它改为:
@Before(" execution(* greetTo(..)) && target(com.baobaotao.expression.Seller)")
目标类的greetTo()方法就得不到增强了。
6 楼
partech
2007-01-23
是不是spring的bug,我就不清楚了。
附件是直接使用aspectj的验证。
输出:
C1.f1
before thisC1PointCut
before targetC2PointCut
C2.f1
附件是直接使用aspectj的验证。
输出:
C1.f1
before thisC1PointCut
before targetC2PointCut
C2.f1
5 楼
stamen
2007-01-23
目前我的结论是:this这个切点标识符是Spring的一个Bug。开发文档上说this用于指定代理对象的类型,而实际上它用于指示代理目标类的类型,所以完全和target一样了。这是我的实验结果,不知道大家有何高见。
4 楼
stamen
2007-01-23
越分析,越觉得两者越没有区别,假设我有二个类,他们分别实现一个接口:
Waiter
|_NaiveWaiter
|_NaughtWaiter
我以下的切点定义都是等效的:
Spring中配置的:
<bean id="waiter1" class="com.baobaotao.expression.NaiveWaiter" />
<bean id="waiter2" class="com.baobaotao.expression.NaughtyWaiter" />
这两个Bean的方法都会被代理。
我都快要疯了 ,难道真的没有区别吗?应该是不会的,可是到底如何分辨呢,难,难,难!
Waiter
|_NaiveWaiter
|_NaughtWaiter
我以下的切点定义都是等效的:
this(Waiter) <==> target(Waiter) <==> target(NaiveWaiter) || target(NaughtWaiter) <==> this(NaiveWaiter) || this(NaughtWaiter)
Spring中配置的:
引用
<bean id="waiter1" class="com.baobaotao.expression.NaiveWaiter" />
<bean id="waiter2" class="com.baobaotao.expression.NaughtyWaiter" />
这两个Bean的方法都会被代理。
我都快要疯了 ,难道真的没有区别吗?应该是不会的,可是到底如何分辨呢,难,难,难!
3 楼
partech
2007-01-23
this和target通常用来限定切点的作用域,单独使用,俺想不出场景,你在pointcut上加个call试一下。
2 楼
stamen
2007-01-23
谢谢partech是回答
可是,象我的例子中Waiter是引用类型,而NaiveWaiter是被调用类型,但以下四种方式定义的切面效果都是一样的:
不知道this和target究竟应用场合有什么区别,我们怎么看到它们不同的效果?
partech 写道
this标示调用方,target标示被调用方.
可是,象我的例子中Waiter是引用类型,而NaiveWaiter是被调用类型,但以下四种方式定义的切面效果都是一样的:
@Before("target(com.baobaotao.expression.NaiveWaiter)")
@Before("target(com.baobaotao.expression.Waiter)")
@Before("this(com.baobaotao.expression.NaiveWaiter)")
@Before("this(com.baobaotao.expression.Waiter)")
不知道this和target究竟应用场合有什么区别,我们怎么看到它们不同的效果?
1 楼
partech
2007-01-23
this标示调用方,target标示被调用方.
发表评论
-
一个常见的Spring IOC疑难症状
2013-07-25 14:14 4951Case 请看下面的IOC实例: 1)Aa ... -
mybatis3.1分页自动添加总数
2013-07-08 21:11 22693问题 1.mybatis默认分页是内存分页的,谁用谁崩溃啊! ... -
学习Spring必学的Java基础知识(9)----HTTP请求报文
2012-06-09 16:02 13853引述要学习Spring框架的技术内幕,必须事先掌握一些基本的J ... -
学习Spring必学的Java基础知识(4)----XML基础知识
2012-05-12 15:33 8480引述要学习Spring框架的 ... -
学习Spring必学的Java基础知识(3)----PropertyEditor
2012-05-12 15:13 16752引述要学习Spring框架的 ... -
学习Spring必学的Java基础知识(2)----动态代理
2012-05-02 13:03 9602引述要学习Spring框架的 ... -
学习Spring必学的Java基础知识(1)----反射
2012-04-25 13:57 89543引述要学习Spring框架的技术内幕,必须事先掌握一些基本的J ... -
透透彻彻IoC(你没有理由不懂!)
2012-04-18 11:01 94034引述:IoC(控制反转:I ... -
单元测试系列之5:使用unitils测试Service层
2012-04-14 10:48 18307引述:Spring 的测试框架为我们提供一个强大的测试环境,解 ... -
如何用Spring读取JAR中的文件
2012-04-13 17:22 18273使用如下方式读取JAR中的文件出错 类路径下 ... -
单元测试系列之3:测试整合之王Unitils
2012-04-09 14:11 15523引述:程序测试对保障应用程序正确性而言,其重要性怎么样强调都不 ... -
单元测试系列之1:开发测试的那些事儿
2012-03-28 12:52 9952引述:程序测试对保障应用程序正确性而言,其重要性怎 ... -
单元测试的那些事儿
2012-03-28 12:48 2------------------------------- ... -
Spring 3.0的新功能
2012-03-26 09:30 71152009年9月发布Spring ... -
Spring的事务管理难点剖析(7):数据连接泄漏
2012-03-07 10:53 6749底层连接资源的访问问题 对于应用开发者来说,数据连接泄 ... -
Spring的事务管理难点剖析(6):特殊方法成漏网之鱼
2012-03-07 09:28 4492哪些方法不能实施Spring ... -
Spring的事务管理难点剖析(5):联合军种作战的混乱
2012-03-07 09:10 7804Spring事务管理器的应对 Spring抽象的DA ... -
Spring的事务管理难点剖析(4):多线程的困惑
2012-03-06 17:30 16841Spring通过单实例化Bean简化多线程问题 由于 ... -
Spring的事务管理难点剖析(3):事务方法嵌套调用的迷茫
2012-03-06 17:23 10516Spring事务传播机制回顾 ... -
Spring的事务管理难点剖析(2):应用分层的迷惑
2012-03-06 16:59 5035Web、Service及DAO三 ...
相关推荐
NULL 博文链接:https://snowolf.iteye.com/blog/1481442
Spring4 In Action-4.2-@AspectJ-切面,Spring4 In Action-4.2-@AspectJ-切面。Spring4 In Action-4.2-@AspectJ-切面
NULL 博文链接:https://samter.iteye.com/blog/410618
一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......
@AspectJ配置Spring AOP,文档,Aspect jar包, 可运行的demo,
NULL 博文链接:https://moshow.iteye.com/blog/1613947
(1) aspectjweaver.jar和aspectjtools.jar(提供两个版本,低版本JDK6的使用aspectj1.6,高版本如JDK8的使用aspectj1.8) (2) spring-aspect.jar,在spring4.3.3的压缩包中。 (3) 特定情况下需要asm.jar,暂未引入 2 ...
NULL 博文链接:https://rain1109.iteye.com/blog/1838100
NULL 博文链接:https://quicker.iteye.com/blog/670885
aspectj.weaver 和 aspectj.tools 类包 Spring 4.X 使用@AspectJ和Schema 报错,添加aspectj.weaver 和 aspectj.tools 类包的依赖。
面向切面编程必不可少的。可以帮助你完成在Hibernate中用annotation完成面向切面的编程。
所以从本文开始介绍@Pointcut切点表达式,虽然Spring AOP的切点表达式尚未 全部实现 @AspectJ 的切点指示符,但是也已经足够多和灵活,本文主要介绍@Pointcut切点表达式中的@within、within这两种切点指示符,结合...
NULL 博文链接:https://zxl359592450.iteye.com/blog/2171403
博文链接:https://shaqiang32.iteye.com/blog/201914
Spring spectJ AOP 前置通知 后置通知 返回通知 异常通知 环绕通知
aspectj和aspectjweaver的jar包,aspectj和aspectjweaver的jar包