Java 在抽象类和子方法之间使用Spring事务代理
我有一个抽象的基本服务和两个实现:Java 在抽象类和子方法之间使用Spring事务代理,java,spring,spring-aop,spring-transactions,Java,Spring,Spring Aop,Spring Transactions,我有一个抽象的基本服务和两个实现: public abstract class AbstractBaseService { public void mainProcess() { for (Foo foo : getFoos()) { doSomething(foo); } } abstract List<Foo> getFoos(); abstract void doSomething(Foo foo); } public class
public abstract class AbstractBaseService {
public void mainProcess() {
for (Foo foo : getFoos()) {
doSomething(foo);
}
}
abstract List<Foo> getFoos();
abstract void doSomething(Foo foo);
}
public class ServiceImplOne extends AbstractBaseService {
protected List<Foo> getFoos() { ... }
protected void doSomething(Foo foo) { ... }
}
public class ServiceImplTwo extends AbstractBaseService { ... }
公共抽象类AbstractBaseService{
公共流程(){
for(Foo-Foo:getFoos()){
doSomething(foo);
}
}
抽象列表getFoos();
抽象无效剂量测定法(Foo-Foo);
}
公共类ServiceImplOne扩展了AbstractBaseService{
受保护列表getFoos(){…}
受保护的无效doSomething(Foo Foo){…}
}
公共类ServiceImplTwo扩展了AbstractBaseService{…}
如果doSomething(foo)
中出现错误,我希望回滚对该对象所做的任何更改,将错误写入日志文件,然后继续处理列表中的下一个对象。因此,我将在我的基本服务的循环中添加一个try-catch。。。并使用实现类中的@Transactional
方法对doSomething
进行注释。但根据该报告:
使用代理时,应仅将@Transactional
注释应用于具有公共可见性的方法。如果使用@Transactional
注释对受保护的、私有的或包可见的方法进行注释,则不会引发错误,但注释的方法不会显示已配置的事务设置。如果需要注释非公共方法,请考虑使用AspectJ(稍后描述)。
我的方法受保护。。。我可以将可见性更改为public
,但还有一个问题:
处理@Transactional
注释的默认通知模式是代理
,它只允许通过代理拦截调用。同一类中的本地调用不能通过这种方式被拦截。对于更先进的拦截模式,考虑结合编译时间或加载时间编织,切换到<代码> AspectJ < /C>模式。
因此,代理将无法拦截来自同一类内的调用这是否也适用于抽象类与其实现之间的调用,或者它是否会按照我的意愿工作?有什么简单的方法可以自己检查吗?(可能是一个愚蠢的问题,当谈到Java代理时,我有点不知所措……)
我已经搜索了一段时间,但我只找到了这些,它们关注的是
@Transactional
标记本身的继承。。。在这种情况下,这并不重要,我不在乎注释所有的doSomething
实现,而仅仅是抽象方法。一个serviceinmplone
的实例就是AbstractBaseService
的实例。创建ServiceImplOne
的实例时,将创建一个对象。其mainProcess()
方法调用其doSomething()
方法
调用不是从一个SpringBean到另一个SpringBean的调用,因此没有任何东西可以被拦截。ServiceImplOne的实例是AbstractBaseService的实例。创建ServiceImplOne实例时,将创建一个对象。它的mainProcess()方法调用它的doSomething()方法。这个调用不是从一个Springbean到另一个Springbean的调用,因此没有任何东西可以被拦截。谢谢@JBNizet。我想这是有道理的,我有两个类,但只有一个对象。。。看来我有一些重构要做。你能发表你的评论作为回答吗?