我正在学习春天,我有跟随
考虑以下bean定义:
现在考虑一下它被声明为切入点*的情况,目标是** clientService bean中的所有方法.
还要考虑ClientServiceImpl类实现3个接口
现在我知道使用AOP会对clientService bean进行代理,并且该代理实现所有3个接口.
但是实现所有这三个接口的确切原因是什么?
所以在我看来,存在两种代理(如果我说错误的断言,请纠正我):
> JDK代理:默认使用Spring(是真的吗?),我有一个接口,用于定义我想要代理的对象的方法.所以这个接口的具体实现是由代理包装的.所以当我在我的对象上调用一个方法时,我在它的代理上调用它.调用由最终执行方面的方法拦截器识别,然后执行调用的方法.
> CGLIB代理:在我看来,代理扩展了包装对象的实现,为它添加了额外的逻辑功能
像这样的东西:
所以在我看来,Spring使用第一种基于接口实现的代理(是不是?):
我认为在AOP中,额外的逻辑由方法拦截器的实现来表示(是真的吗?),标准逻辑由定义在接口中的方法的实现来表示.
但是,如果之前的推理是正确的,我的疑问是:为什么我需要定义这些接口,并且由对象包装的对象实现这些接口? (我无法理解代理本身是否实现了这些接口).
为什么?究竟如何运作?
TNX
But what is the exact reason for which all these 3 interface are
implemented?
如果代理没有实现所有这些接口,则无法将bean连接到使用该接口的其他bean(您将获得ClassCastException).例如,将该接口的所有bean自动装配到bean中.此外,如果代理没有实现接口,像getBeanNamesForType这样的东西将无法工作.
So it seems to me that exist 2 kinds of proxies (correct me if I am
saying wrong assertions)
对,那是正确的.请参阅ScopedProxyMode.默认情况下,Spring不会创建代理.如果需要包装bean以添加其他行为(AOP),它只会创建一个代理.请注意,还有a special case of the CGLIB based proxy使用Objenesis来处理没有默认构造函数的子类化目标.
CGLIB Proxy: in wich,it seems to me that,the proxy extend the
implementation of the wrapped object adding to it the extra logic
features
当您使用基于CGLIB的代理时,bean的构造函数会被调用两次:一次是动态生成的子类实例化(创建代理),另一次是创建实际的bean(目标).
I think that in AOP the extra logic is represented by the
implementation of the method interceptor (is it true?)
代理基本上只是调用需要应用的建议链.该建议未在代理本身中实现.例如,对@Transactional的建议生活在TransactionAspectSupport中.看一下JdkDynamicAopProxy的来源.
and the standard logic is represented by the implementation of the
method defined into the interfaces.
假设您正在针对接口进行编程并使用正确的JDK代理.
But,if the prevIoUs reasoning are correct,my doubts is: why I need
to define these interface and do that the object wrapped by the object
implement these interfaces? (I can’t understand if the proxy itself
implement these interfaces).
如果要使用基于接口的代理,则需要使用接口.只需确保所有bean都实现接口,所有建议的方法都由这些接口定义,并且当一个bean依赖于另一个bean时,使用接口指定该依赖项. Spring将负责构建代理并确保它实现所有接口.
在您的图表中,您有“Spring AOP Proxy(this)”.当您使用任何类型的代理时,您必须非常小心地使用它.
>同一类中的调用将不会应用建议,因为这些调用不会通过代理.
>如果在你的一个bean中将它传递给一些外部代码,那么你就传递了AOP建议的目标.如果某些其他代码使用该引用,则调用将不会应用AOP建议(再次,您绕过代理).