【发布时间】:2015-06-21 10:06:58
【问题描述】:
我正在学习 Spring,我有以下内容
考虑以下 bean 定义:
<bean id="clientService" class="com.myapp.service.ClientServiceImpl" />
现在考虑将其声明为 pointcut* 的情况,该切入点针对 **clientService bean 中的所有方法。
还要考虑 ClientServiceImpl 类实现 3 个接口
现在我知道使用 AOP 代理了 clientService bean,并且该代理实现了所有 3 个接口。
但是实现这三个接口的确切原因是什么?
所以在我看来存在 2 种代理(如果我说的断言错误,请纠正我):
JDK 代理:默认情况下从 Spring 中使用(是真的吗?)我有一个接口来定义我想要代理的对象的方法。所以这个接口的具体实现是被代理包裹起来的。所以当我在我的对象上调用一个方法时,我是在它的代理上调用它。 方法拦截器会识别调用,该方法最终会执行方面,然后执行调用的方法。
CGLIB 代理:在我看来,代理扩展了包装对象的实现,并为其添加了额外的逻辑功能
类似这样的:
所以在我看来,Spring 使用了第一种基于接口实现的代理(对吗?):
我认为在 AOP 中,额外的逻辑由 方法拦截器 的实现表示(是真的吗?),标准逻辑由接口中定义的方法。
但是,如果前面的推理是正确的,我的疑惑是:为什么我需要定义这些接口,而被对象包裹的对象要实现这些接口呢? (我不明白代理本身是否实现了这些接口)。
为什么?具体是如何工作的?
Tnx
【问题讨论】:
标签: java spring design-patterns aop spring-aop