Java Spring事务管理-将注释放置在何处?
如果我有一个事务管理类,其中我有两个方法,例如Java Spring事务管理-将注释放置在何处?,java,spring,transactions,annotations,Java,Spring,Transactions,Annotations,如果我有一个事务管理类,其中我有两个方法,例如 void OuterMethod(Data somedata) { this.InnerMethod(somedata) } @Transactional("mymanager") void InnerMethod(Data somedata) { //writes some things } 这有效吗?由于某种原因,我无法让它写入数据库,尽管它不会给我任何错误 Spring不使用字节码 实现AOP的工具。所以 可以预见,如果
void OuterMethod(Data somedata)
{
this.InnerMethod(somedata)
}
@Transactional("mymanager")
void InnerMethod(Data somedata)
{
//writes some things
}
这有效吗?由于某种原因,我无法让它写入数据库,尽管它不会给我任何错误
Spring不使用字节码
实现AOP的工具。所以
可以预见,如果
代理对象调用另一个方法
在同一对象中,方面将
不能应用于方法调用。
然而,Spring允许应用
通过设置调用此方法的方面
exposeProxy为True并使用
.currentProxy()
该信息可能有点过时,但据我所知,它仍然是准确的(但不确定“exposeProxy”标志)
参见这是一个棘手的话题。当Spring找到
@Transactional
注释时,它会使用基于JDK接口的代理或基于CGLIB子类的代理为您的对象创建一个代理。在这两种情况下,代理仅适用于公共方法。我可能把事情简化了一点,但这是总的想法
因此,尽管仍然可以生成一个代理对象来处理带注释的InnerMethod()
,但它实际上不会被调用,因为非公共方法将“落空”。如果Spring警告你这一点会很好,但事实并非如此
简单的解决方案是确保注释位于公共方法上。对不起,我对Java或Spring了解不多。你介意澄清一下吗?这是否意味着我应该只注释OuterMethod?是的,这就是它的本质。问题在于事务处理位于不同的对象中。因此,您调用proxy.OuterMethod()->service.OuterMethod()->service.InnerMethod(),所有事务处理都在proxy.InnerMethod()中,这是无法从service.OuterMethod()访问的。如果不使用AopContext.currentProxy(),这将是一个非常糟糕的解决方法。所以是的,注释OuterMethod()或者两者都可以。没错。代理的替代方法是使用AspectJ AOP,或者通过加载时编织(丑陋,必须替换类加载器)或者编译时编织(使构建过程复杂化,但是Eclipse和Maven提供了良好的工具支持)。注意:按照惯例,Java中的方法名以小写字符开头(即outerMethod(),innerMethod()