滿漢樓02 4.功能實現04 4.6顯示所有菜品 4.6.1思路分析 創建一個菜單表menu,在Domain層創建與菜單表對應的Javabean-Menu類,在DAO層創建MenuDAO,完成對menu表的增刪改查,在Service層創建一個和menu表相關的service類,service類提供給 ...
今天看黑馬redis的課,裡面講到了一個事務註解不生效的問題。
究其原因,就在於Spring中事務註解生效的條件。那麼接下來就說一下自己的心得。
- 查了一下資料,就是說如果想讓@Transactional註解生效,那麼就只有當被代理類對象調用它的事務方法時,事務註解才會起作用。
- 那如何才能創建代理對象呢,這個Spring也幫我們做好了。
- 只要使用註入bean的方式(也就是依賴註入的方式)去創建bean對象,該bean對象調用被@T註解了的方法,那麼就會走代理類,從而@T註解就起作用了。
以下說一下例子吧
public class VoucherOrderServiceImpl implements IVoucherOrderService
@Override
public Result seckillVocher(Long voucherId) {
IVoucherOrderService o = (IVoucherOrderService) AopContext.currentProxy();
return o.secKill(voucherId);
}
@Override
@Transactional
public Result secKill(Long voucherId) {
}
}
- 在一個方法中調用另一個@T註釋的方法,如果直接this.xxx()去調用,那麼@T不會生效,上面說的原因嘛,沒有走動態代理類。
- 那怎麼辦呢,我們手動的創建一個代理類對象就能解決改問題。
- 為什麼要生成IVoucherOrderService這個類型的動態代理類對象呢?
-- 這樣想:1.我們要去調用該類的@T方法,肯定要指定成該對象類型。2.換個說法,如果使用註入bean的方式調用該@T方法,不也是生成這個類型的代理類對象嗎