7

在 spring 中使用 cglib 代理会导致:

a) 构造函数的双重调用

b) 不允许拦截从另一个方法调用的方法

但是为什么spring创建一个bean然后是一个代理?是否可以动态生成扩展指定 bean 类的类,然后只调用一次构造函数?这将解决公共和受保护方法的a)和b)。我错过了什么吗?

4

1 回答 1

4

好问题。我认为这是由于 Spring 引导应用程序上下文的方式:它首先创建所有原始 bean,然后应用后处理器,例如添加 AOP(包括事务)。这种分层架构需要先创建普通 bean,然后再包装它。有人可能会争辩说,这种方法遵循组合优于继承的原则。

另请注意,a)应该不是问题。类不应在构造函数中执行初始化,而应在@PostConstruct方法中执行 - 该方法仅被调用一次。另一方面,这会导致另一个问题:

c) 不能将构造函数注入与 CGLIB 代理一起使用,请参阅SPR-3150

但我理解你的沮丧。猜猜唯一有效的解决方法是对我们完整的 AspectJ 编织。

于 2012-10-20T11:05:24.247 回答