猿问

Spring@Transaction方法调用同一类中的方法,不工作吗?

Spring@Transaction方法调用同一类中的方法,不工作吗?

我是Spring事务的新手。有些事我觉得很奇怪,也许我确实理解得很清楚。我希望在方法级别上有一个事务处理,并且在同一个类中有一个调用者方法,看起来它不是这样的,它必须从单独的类中调用。我不明白这怎么可能。如果有人知道如何解决这个问题,我将非常感激。我想使用同一个类来调用带注释的事务性方法。

以下是代码:

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);
        }
    } }


慕丝7291255
浏览 2354回答 3
3回答

互换的青春

这里的问题是,Spring的AOP代理没有扩展,而是包装您的服务实例来拦截调用。这样做的效果是,服务实例中对“this”的任何调用都将直接在该实例上调用,并且不能被包装代理截获(代理甚至不知道任何此类调用)。已经提到了一个解决办法。另一个很好的方法是让Spring将服务的一个实例注入到服务本身,并在注入的实例上调用您的方法,该实例将是处理您的事务的代理。但是请注意,如果您的服务bean不是单例的话,这可能也会产生不良的副作用:<bean&nbsp;id="userService"&nbsp;class="your.package.UserService"> &nbsp;&nbsp;<property&nbsp;name="self"&nbsp;ref="userService"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;...</bean>public&nbsp;class&nbsp;UserService&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;UserService&nbsp;self; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setSelf(UserService&nbsp;self)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.self&nbsp;=&nbsp;self; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Transactional &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;addUser(String&nbsp;userName,&nbsp;String&nbsp;password)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;call&nbsp;DAO&nbsp;layer&nbsp;and&nbsp;adds&nbsp;to&nbsp;database. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Throwable&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionAspectSupport.currentTransactionStatus() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setRollbackOnly(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;addUsers(List<User>&nbsp;users)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(User&nbsp;user&nbsp;:&nbsp;users)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.addUser(user.getUserName,&nbsp;user.getPassword); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;}

慕后森

有了Spring 4,你就有可能自我反省@Service@Transactionalpublic&nbsp;class&nbsp;UserServiceImpl&nbsp;implements&nbsp;UserService{ &nbsp;&nbsp;&nbsp;&nbsp;@Autowired &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;&nbsp;UserRepositroy&nbsp;repositroy; &nbsp;&nbsp;&nbsp;&nbsp;@Autowired &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;UserService&nbsp;userService; &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;update(int&nbsp;id){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repository.findOne(id).setName("ddd"); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;save(Users&nbsp;user)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repositroy.save(user); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userService.update(1); &nbsp;&nbsp;&nbsp;&nbsp;}}
随时随地看视频慕课网APP

相关分类

Java
我要回答