我是Spring Transaction的新手。我发现有些事情很奇怪,也许我确实理解得很清楚。我想在方法级别周围进行事务处理,而我在同一个类中有一个调用者方法,似乎不喜欢它,必须从单独的类中调用它。我不知道怎么可能。如果有人知道如何解决此问题,我将不胜感激。我想使用相同的类来调用带注释的事务方法。
这是代码:
public class UserService { @Transactional public boolean addUser(String userName, String password) { try { // call DAO layer and adds to database. } catch (Throwable e) { TransactionAspectSupport.currentTransactionStatus() .setRollbackOnly(); } } public boolean addUsers(List<User> users) { for (User user : users) { addUser(user.getUserName, user.getPassword); } } }
这里的问题是,Spring的AOP代理不会扩展,而是包装你的服务实例以拦截调用。这样的结果是,在你的服务实例中直接调用该服务实例中对“ this”的任何调用,并且包装代理不能截获该调用(该代理甚至不知道任何此类调用)。已经提到一种解决方案。另一个不错的选择是让Spring将服务的一个实例注入到服务本身中,然后在注入的实例上调用你的方法,该实例将成为处理事务的代理。但是请注意,如果你的服务bean不是单例的,这也会带来不良的副作用:
<bean id="userService" class="your.package.UserService"> <property name="self" ref="userService" /> ... </bean> public class UserService { private UserService self; public void setSelf(UserService self) { this.self = self; } @Transactional public boolean addUser(String userName, String password) { try { // call DAO layer and adds to database. } catch (Throwable e) { TransactionAspectSupport.currentTransactionStatus() .setRollbackOnly(); } } public boolean addUsers(List<User> users) { for (User user : users) { self.addUser(user.getUserName, user.getPassword); } } }