aop - 为什么基于纯继承的代理在 AoP 中不好

标签 aop spring.net proxy-classes

我在同一类中的方法之间进行方法调用并应用事务建议时遇到问题。

Spring Framework .NET 文档声明它支持基于组合和继承的代理,并且您可以强制 Spring 创建要实例化的基于继承的代理(没有目标的代理)。

然而,事实证明即使是“基于继承的代理”也不是他们所声称的那样。他们确实继承了目标类而不是它的接口(interface),但他们仍然使用目标对象。这导致了这样一个事实,即在同一类建议的方法之间的调用不适用。

诚然,Spring 可以使用 InheritanceBasedAopConfigurer 做一些努力来做到这一点,但您仍然必须列出要应用它的对象和要应用到它们的建议。

为什么 Spring 会千方百计避免真正基于继承的代理?我缺少什么反模式?

最佳答案

我可以看到多种原因:

1) 实现更复杂。 IoC 容器管理实例,要应用基于纯继承的代理,您需要处理类型。这就是“InheritanceBasedAopConfigurer”的作用:它在容器初始化之前更改类型。

2) 如果您希望 AOP 工作,您需要将您的方法标记为虚拟方法。这不直观。

3) 基于组合的代理强制通过接口(interface)进行设计,这是一种很好的做法。

关于aop - 为什么基于纯继承的代理在 AoP 中不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8932396/

相关文章:

nhibernate - 使用Spring和Hibernate在两个数据库实例中使用声明式事务管理

java - 为类类型创建 Java Proxy 实例?

c# - 我可以对 RealProxy 实例使用反射吗?

ruby - 使用 Aquarium 的 Ruby 异常处理中的 SystemStackError(面向方面​​的编程)

java - Spring 错误 "Bean named ' x' 应为 'y' 类型,但实际上是 [com.sun.proxy.$Proxy] 类型”

nhibernate - 多个数据库提供者 - 没有可用的数据库提供者

c++ - vector<bool> 如何处理引用和迭代器?

javascript - 有没有办法用一个函数包装所有的 JavaScript 方法?

java - 管理元编程(AOP/反射/宏)技术复杂性的实践

c# - Spring.Net可以为所有派生类注入(inject)抽象类构造函数arg吗