類以及方法使用@Transactional註解事務後獲取類實例

今天在做項目時,由於類型很多,就改成了類似策略模式的,不使用if else,方便後期擴展

把所有的實現類繼承同一接口,再一個不相干的類進行構造所有實現類

@Service
public class SendTemplateService {

    Map<String, WechatSendTemplateService> wechatSendTemplateServiceMap = new HashMap<>();

    // 構造函數,如果你是集合接口對象,那麼就會把spring容器中所有關於該接口的子類,全部抓出來放入到集合中,如果子類使用了@Transactional事務註解,所獲取的類都是代理實例,獲取的類名也是附帶代理實例信息
    public SendTemplateService(List<WechatSendTemplateService> wechatSendTemplateServices) {
        for (WechatSendTemplateService wechatSendTemplateService : wechatSendTemplateServices) {
            wechatSendTemplateServiceMap.put(wechatSendTemplateService.getClass().getSimpleName()
                    .replace("SendTemplateServiceImpl", "").toUpperCase(), wechatSendTemplateService);
        }
    }
}

思路是把所有實現的類放入map,將名稱改成自己所約定的key。map的key放入的時候全部大寫放入的,方便匹配

在使用key匹配的時候發現了一個現象,用類名匹配不上

注意看後面的springcglib,一看就是用了代理模式。有兩個類的類名沒有帶代理實例的信息,其他全部帶了代理實例信息

代碼的區別就是沒有帶的兩個類沒有用@Transactional註解

其他的都是用了@Transactional事務註解。

突然想起了Spring的事務用的是AOP代理模式實現。所以用了@Transactional的類都會被代理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章