避免使用Spring CGLIB代理出现问题

8
在Spring中使用cglib代理会导致以下问题:
a)构造函数被调用两次;
b)不允许拦截从另一个方法调用的方法。
但是,为什么Spring会创建一个bean和一个代理?是否可能动态生成一个继承指定bean类的类,并仅调用一次构造函数?这将解决公共和受保护方法的a)和b)。我有什么遗漏吗?
1个回答

4

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

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

c)无法在CGLIB代理中使用构造函数注入,请参见SPR-3150

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接