java – 为什么在Spring AOP中,对象被包装到实现接口的JDK代理
我正在学习春天,我有跟随 考虑以下bean定义:
现在考虑一下它被声明为切入点*的情况,目标是** clientService bean中的所有方法. 还要考虑ClientServiceImpl类实现3个接口 现在我知道使用AOP会对clientService bean进行代理,并且该代理实现所有3个接口. 但是实现所有这三个接口的确切原因是什么? 所以在我看来,存在两种代理(如果我说错误的断言,请纠正我): > JDK代理:默认使用Spring(是真的吗?),我有一个接口,用于定义我想要代理的对象的方法.所以这个接口的具体实现是由代理包装的.所以当我在我的对象上调用一个方法时,我在它的代理上调用它.调用由最终执行方面的方法拦截器识别,然后执行调用的方法. 像这样的东西: 所以在我看来,Spring使用第一种基于接口实现的代理(是不是?): 我认为在AOP中,额外的逻辑由方法拦截器的实现来表示(是真的吗?),标准逻辑由定义在接口中的方法的实现来表示. 但是,如果之前的推理是正确的,我的疑问是:为什么我需要定义这些接口,并且由对象包装的对象实现这些接口? (我无法理解代理本身是否实现了这些接口). 为什么?究竟如何运作? TNX 最佳答案
如果代理没有实现所有这些接口,则无法将bean连接到使用该接口的其他bean(您将获得ClassCastException).例如,将该接口的所有bean自动装配到bean中.此外,如果代理没有实现接口,像getBeanNamesForType这样的东西将无法工作.
对,那是正确的.请参阅ScopedProxyMode.默认情况下,Spring不会创建代理.如果需要包装bean以添加其他行为(AOP),它只会创建一个代理.请注意,还有a special case of the CGLIB based proxy使用Objenesis来处理没有默认构造函数的子类化目标.
当您使用基于CGLIB的代理时,bean的构造函数会被调用两次:一次是动态生成的子类实例化(创建代理),另一次是创建实际的bean(目标).
代理基本上只是调用需要应用的建议链.该建议未在代理本身中实现.例如,对@Transactional的建议生活在TransactionAspectSupport中.看一下JdkDynamicAopProxy的来源.
假设您正在针对接口进行编程并使用正确的JDK代理.
如果要使用基于接口的代理,则需要使用接口.只需确保所有bean都实现接口,所有建议的方法都由这些接口定义,并且当一个bean依赖于另一个bean时,使用接口指定该依赖项. Spring将负责构建代理并确保它实现所有接口. 在您的图表中,您有“Spring AOP Proxy(this)”.当您使用任何类型的代理时,您必须非常小心地使用它. >同一类中的调用将不会应用建议,因为这些调用不会通过代理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |