Spring處理交易管理的@Transactional注釋可標註在類別(class)或方法(method)前,標注在類別的效果如下。
@Transactional標註在類別上則該類別及子類別的所有public方法都會套用@Transactional,但非公開方法則不會套用,因為Spring @Transactional是透過AOP的CGLIB代理(proxy)機制生成代理類別來達成交易管理,而CGLIB只對公開方法有效果。
例如下面在DemoService類別加上@Transactional。
DemoService
package com.abc.demo.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Service
public class DemoService {
public void addFoo() {
// ...
}
public void deleteFoo() {
// ...
}
private void modifyBar() {
// ...
}
}
效果相當於下面。
DemoService
package com.abc.demo.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class DemoService {
@Transactional
public void addFoo() {
// ...
}
@Transactional
public void deleteFoo() {
// ...
}
private void modifyBar() {
// ...
}
}
因為modifyBar()是private方法,所以不會套用@Transactional。
若同時在類別及方法都標有@Transactional,則方法的@Transactional會覆寫(override)類別的@Transactional效果。
沒有留言:
張貼留言