如果我有一个事务管理类,我有两种方法,例如
void OuterMethod(Data somedata)
{
this.InnerMethod(somedata)
}
@Transactional("mymanager")
void InnerMethod(Data somedata)
{
//writes some things
}
这是有效的吗?我出于某种原因无法写入数据库,虽然它没有给我任何错误。
答案 0 :(得分:2)
Spring不使用字节码 用于实施AOP的仪器。所以 如果一种方法可以预测 代理对象调用其他方法 在同一个对象中,方面会 不适用于方法调用。 然而Spring允许应用 此方法的方面通过设置调用 exposeProxy为True并使用 AopContext。currentProxy()。
信息可能有点过时,但据我所知,它仍然准确(虽然不确定“exposeProxy”标志)
答案 1 :(得分:0)
这是一个棘手的话题。当Spring找到@Transactional
注释时,它会使用基于JDK接口的代理或基于CGLIB子类的代理为您的对象创建代理。在这两种情况下,代理仅适用于公共方法。我可能过分简化了一些事情,但这是一般的想法。
因此,虽然仍然可以生成代理对象来处理带注释的InnerMethod()
,但实际上它不会被调用,因为非公共方法将“崩溃”。如果Spring警告你这件事会很好,但事实并非如此。
简单的解决方案是确保您的注释适用于公共方法。