實(shí)現(xiàn)功能
在項(xiàng)目啟動(dòng)時(shí)將字典表中的字典項(xiàng)加載到內(nèi)存纫版,通過靜態(tài)工具類的靜態(tài)map半夷,支持根據(jù)key查詢value,根據(jù)value查詢key焙畔。
@Component
public class CacheUtils {
public static Map<String, BiMap<String, String>> lMap = Maps.newHashMap();
@Autowired
private BaseDictMapper mapper;
@Autowired
private BaseDictService service;
@PostConstruct
public void init() {
List<BaseDict> list = mapper.selectTypes();
for (BaseDict dict : list) {
QueryWrapper<BaseDict> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("TYPE", dict.getType());
List<BaseDict> typeList = service.list(queryWrapper);
BiMap<String, String> listMap = HashBiMap.create();
for (BaseDict dict1 : typeList) {
listMap.put(dict1.getName(), dict1.getValue());
}
lMap.put(dict.getType(), listMap);
}
}
}
@Mapper
public interface BaseDictMapper extends SuperMapper<BaseDict> {
@Select("select distinct(type) from base_dict ")
List<BaseDict> selectTypes();
}
CREATE TABLE `base_dict` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`NAME` varchar(20) DEFAULT NULL COMMENT '標(biāo)簽名稱',
`VALUE` varchar(20) DEFAULT NULL COMMENT '標(biāo)簽值',
`TYPE` varchar(20) DEFAULT NULL COMMENT '類型',
`DESCRIPTION` varchar(255) DEFAULT NULL COMMENT '中文描述',
`PARENT_ID` int(11) DEFAULT NULL COMMENT '父節(jié)點(diǎn)id',
`REMARK` varchar(255) DEFAULT NULL COMMENT '備注',
`CREATE_TIME` datetime DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
`UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新時(shí)間',
`YN` int(11) DEFAULT NULL COMMENT '是否有效掸读,1有效,0失效',
PRIMARY KEY (`ID`),
KEY `DICT_VALUE` (`VALUE`),
KEY `DICT_LABEL` (`NAME`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='字典';
lmap存儲(chǔ)字典中的所有字典項(xiàng),根據(jù)type查詢對(duì)應(yīng)類型的name和value儿惫。返回的BiMap支持根據(jù)key查詢value澡罚,
inverse()可以將value和key反轉(zhuǎn),根據(jù)value查詢key肾请。lmap獲取的結(jié)構(gòu)如下:
guava BiMap
BiMap是一個(gè)雙向關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu)留搔,而它對(duì)key和value嚴(yán)格的保證唯一性。
? 如果使用put方法添加相同的value值或key值則會(huì)拋出異常:java.lang.IllegalArgumentException铛铁;
? 如果使用forcePut方法添加則會(huì)覆蓋掉原來的value值隔显。
? inverse方法會(huì)返回一個(gè)反轉(zhuǎn)的BiMap,但是注意這個(gè)反轉(zhuǎn)的map不是新的map對(duì)象饵逐,它實(shí)現(xiàn)了一種視圖關(guān)聯(lián)括眠,對(duì)于反轉(zhuǎn)后的map的所有操作都會(huì)影響原先的map對(duì)象。
@PostConstruct
spring中Constructor倍权、@Autowired掷豺、@PostConstruct的順序(網(wǎng)上解釋比較清楚的版本)
要將對(duì)象p注入到對(duì)象a,那么首先就必須得生成對(duì)象p與對(duì)象a薄声,才能執(zhí)行注入当船。所以,如果一個(gè)類A中有個(gè)成員變量p被@Autowired注解默辨,那么@Autowired注入是發(fā)生在A的構(gòu)造方法執(zhí)行完之后的德频。
如果想在生成對(duì)象時(shí)候完成某些初始化操作,而偏偏這些初始化操作又依賴于依賴注入缩幸,那么就無法在構(gòu)造函數(shù)中實(shí)現(xiàn)壹置。為此,可以使用@PostConstruct注解一個(gè)方法來完成初始化桌粉,@PostConstruct注解的方法將會(huì)在依賴注入完成后被自動(dòng)調(diào)用蒸绩。
Constructor >> @Autowired >> @PostConstruct
@Component
public class ExcelListener extends AnalysisEventListener {
public static ExcelListener listener;
@Autowired
private ApiInfoService apiInfoService;
@Autowired
private ApiInfoImportErrorService apiInfoImportErrorService;
/**
* 通過@PostConstruct實(shí)現(xiàn)初始化bean之前進(jìn)行的操作
* 解決apiInfoService 無法注入的問題
*/
@PostConstruct
public void init(){
listener = this;
listener.apiInfoService = this.apiInfoService;
listener.apiInfoImportErrorService = apiInfoImportErrorService;
}
...
}
ExcelListener在使用apiInfoService時(shí)無法自動(dòng)注入,通過定義一個(gè)靜態(tài)變量 listener铃肯,使用@PostConstruct方法來初始化。