Inject self and call through it the @Transactional
method
public class AccountService {
@Autowired
private AccountService self;
@Transactional
public void resetAllAccounts(){
//...
}
@PostConstruct
private void init(){
self.resetAllAccounts();
}
}
For older Spring versions which do not support self-injection, inject BeanFactory
and get self
as beanFactory.getBean(AccountService.class)
EDIT
It looks like that since this solution has been posted 1.5 years ago developers are still under impression that if a method,
annotated with @Transactional
, is called from a @PostContruct
-annotated method invoked upon the Bean initialization, it won't be actually executed inside of Spring Transaction, and awkward (obsolete?) solutions get discussed and accepted instead of this very simple and straightforward one and the latter even gets downvoted.
The Doubting Thomases :) are welcome to check out an example Spring Boot application at GitHub which implements the described above solution.
What actually causes, IMHO, the confusion: the call to @Transactional
method should be done through a proxied version of a Bean where such method is defined.
When a @Transactional
method is called from another Bean, that another Bean usually injects this one and invokes its proxied (e.g. through @Autowired) version of it, and everything is fine.
When a @Transactional
method is called from the same Bean directly, through usual Java call, the Spring AOP/Proxy machinery is not involved and the method is not executed inside of Transaction.
When, as in the suggested solution, a @Transactional
method is called from the same Bean through self-injected proxy (self
field), the situation is basically equivalent to a case 1.