这里的问题是,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);
}
}
}