今天在做項目時,由於類型很多,就改成了類似策略模式的,不使用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的類都會被代理