如何处理Spring/EJB/Mockito上的内部调用代理?
正如您许多人在代理对象时所知道的那样,例如当您为Spring / EJB创建具有事务属性的Bean时,甚至当您使用某些框架创建部分模拟时,代理对象也不知道这一点,并且内部调用不会重定向,然后也不会被拦截......
这就是为什么如果你在春天做这样的事情:
@Transactionnal
public void doSomething() {
doSomethingInNewTransaction();
doSomethingInNewTransaction();
doSomethingInNewTransaction();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomethingInNewTransaction() {
...
}
当您调用doSomething时,除了主要事务之外,您还期望有3个新事务,但实际上,由于此问题,您只能获得一个...
所以我想知道你如何处理这些问题...
实际上,我处于必须处理复杂事务系统的情况下,我没有看到比将我的服务拆分为许多小服务更好的方法,这样我就可以确保通过所有代理...
这让我很困扰,因为所有的代码都属于同一个功能领域,不应该被拆分......
我发现这个相关的问题有有趣的答案:春天 - @Transactional - 背景中会发生什么?
Rob H说我们可以在服务中注入spring代理,并调用proxy.doSomethingInNewTransaction();相反。这很容易做到,而且它有效,但我真的不喜欢它...
侯云峰是这样说的:
所以我编写了我自己的 CglibSubclassingInstantiationStrategy 和代理创建者版本,以便它将使用 CGLIB 生成一个真正的子类,该子类将调用委托给其超级而不是另一个实例,Spring 现在正在这样做。因此,我可以自由地注释任何方法(只要它不是私有的),并且无论我在哪里调用这些方法,它们都会得到照顾。好吧,我仍然要付出代价:1.我必须列出我想要启用新的CGLIB子类创建的所有注释。2. 我无法对最终方法进行注释,因为我现在正在生成子类,因此最终方法无法被截获。
他所说的“哪个春天现在在做什么”是什么意思?这是否意味着内部事务调用现在被截获?
您认为什么更好?
当你需要一些事务粒度时,你会拆分你的类吗?还是使用如上所述的解决方法?(请分享)