避免spring cglib代理问题

时间:2012-10-20 10:49:57

标签: java spring proxy cglib

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

a)构造函数的双重调用

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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