And*_*ili 8 java aop spring design-patterns spring-aop
我正在学习春天,我有跟随
考虑以下bean定义:
<bean id="clientService" class="com.myapp.service.ClientServiceImpl" />
现在考虑一下它被声明为切入点*的情况,目标是**clientService bean中的所有方法.
还要考虑ClientServiceImpl类实现3个接口
现在我知道,使用AOP的clientService bean是代理和该代理实现了所有的3个接口.
但是实现所有这三个接口的确切原因是什么?
所以在我看来,存在两种代理(如果我说错误的断言,请纠正我):
JDK代理:默认使用Spring(是真的吗?),我有一个接口,用于定义我想要代理的对象的方法.所以这个接口的具体实现是由代理包装的.所以当我在我的对象上调用一个方法时,我在它的代理上调用它.调用由最终执行方面的方法拦截器识别,然后执行调用的方法.
CGLIB代理:在我看来,代理扩展了包装对象的实现,为它添加了额外的逻辑功能
像这样的东西:

所以在我看来,Spring使用第一种基于接口实现的代理(是不是?):

我认为在AOP中,额外的逻辑由方法拦截器的实现来表示(是真的吗?),标准逻辑由定义在接口中的方法的实现来表示.
但是,如果之前的推理是正确的,我的疑问是:为什么我需要定义这些接口,并且由对象包装的对象实现这些接口?(我无法理解代理本身是否实现了这些接口).
为什么?究竟如何运作?
TNX
但是实现这三个接口的确切原因是什么?
如果代理没有实现所有这些接口,则该 bean 无法连接到使用该接口的其他 bean(您将得到 ClassCastException)。例如,将该接口的所有 bean 自动装配到一个 bean 中。此外,如果代理没有实现该接口,像getBeanNamesForType这样的东西将无法工作。
所以在我看来存在两种代理(如果我说错了断言请纠正我)
对,那是正确的。请参阅ScopedProxyMode。默认情况下,Spring不会创建代理。它仅在需要包装 bean 以添加附加行为 (AOP) 时才创建代理。请注意,还有一种基于 CGLIB 的代理的特殊情况,它使用 Objenesis 来处理没有默认构造函数的子类化目标。
CGLIB 代理:在我看来,代理扩展了包装对象的实现,并向其添加了额外的逻辑功能
当您使用基于 CGLIB 的代理时,bean 的构造函数会被调用两次:一次是在实例化动态生成的子类时(以创建代理),第二次是在创建实际 bean 时(目标)。
我认为在 AOP 中,额外的逻辑是由方法拦截器的实现来表示的(这是真的吗?)
代理本质上只是调用需要应用的建议链。该建议并未在代理本身中实现。例如, TransactionAspectSupport@Transactional中的生命建议。查看JdkDynamicAopProxy的源代码。
标准逻辑由接口中定义的方法的实现来表示。
假设您正在针对接口进行编程并使用 JDK 代理,这是正确的。
但是,如果前面的推理是正确的,我的疑问是:为什么我需要定义这些接口,并且对象所包装的对象是否实现这些接口?(我不明白代理本身是否实现这些接口)。
如果您想使用基于接口的代理,则需要使用接口。只需确保所有 bean 都实现接口,所有建议的方法都由这些接口定义,并且当一个 bean 依赖于另一个 bean 时,该依赖关系是使用接口指定的。Spring 将负责构建代理并确保它实现所有接口。
在你的图中,你有“Spring AOP Proxy (this)”。this当您使用任何类型的代理时,  您必须非常小心地使用。
this给某些外部代码,则您正在传递 AOP 建议的目标。如果其他代码使用该引用,则调用将不会应用 AOP 建议(同样,您将绕过代理)。| 归档时间: | 
 | 
| 查看次数: | 3306 次 | 
| 最近记录: |