1、在開發過程中,由於某些模塊的功能依賴於一些特定的數據纔可以進行,或者有一些模塊頻繁的調用數據庫固定的資源。此時,我們可以在項目啓動的時候去執行某些方法,從而實現某些功能的完善和提高某些模塊的性能。
2、項目啓動調用方法有三種實現方式
(1)、通過方法上添加@PostConstruct實現
這種方法需要初始化容器的時候,@PostConstruct所在的類被加載到容器中才可以,添加次註解後,需要放在註解可掃描的地方。
@Compant
public class Demo{
@PostConstruct
public void init(){
//項目啓動執行方法
}
}
(2)、通過在配置文件注入bean的地方添加init-method方法
這種方法會在注入bean到容器時,主動去調用init-method指定的方法
<bean id="Demo" class="com.xxx.Demo" scope="singleton" init-method="init">
</bean>
(3)、實現 InitializingBean 接口,覆寫 afterPropertiesSet()方法
這種方法,可以實現執行多個初始化方法。這裏做了一個添加一級緩存的案例,僅供參考學習
第一步,
創建啓動項目需要執行的方法,這裏我們實現,在啓動項目時添加所有的數據字典到緩存中。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class SysDictCacheServiceImpl implements SysDictCacheService {
private static final Logger logger = LoggerFactory.getLogger(SysDictCacheServiceImpl.class);
@Autowired
private DictDao dictDao;
@Override
public CacheRegionEnum getRegion() {
return CacheRegionEnum.SYS_DICT_TYPE;
}
@Override
public CacheService.DataLoader<List<Dict>> getLoader() {
return (typeCode) -> dictDao.listAllDictByType(typeCode);
}
@Override
public void init() {
logger.info("==============初始化所有數據字典緩存=====================");
List<Dict> dictList = dictDao.listAllDictByType(null); // 獲取全部字典
Map<String, List<Dict>> map = dictList.stream()
.collect(Collectors.groupingBy(Dict::getTypeCode)); // 根據字典編碼封裝map
set(map); // 保存到緩存中
}
}
其上層接口爲
import com.commons.cache.CacheInitiator;
import com.commons.cache.CacheService;
import com.model.Dict;
import java.util.List;
// CacheService爲實現緩存的方法,CacheInitiator用來初始化的init方法
public interface SysDictCacheService extends CacheService<List<Dict>>, CacheInitiator {
}
CacheService接口如下,主要覆寫緩存的操作方法如set,get,exist等
CacheInitiator接口,實現init方法
以上的部分可根據自身分情況去做調整
第二步,覆寫 afterPropertiesSet()方法
通過注入集合CacheInitiator,調用對應實現的init方法,如上我們就實現了CacheInitiator接口,實現init方法,這裏我們就可以實現獲取多個,調用多個init方法。
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
public class CacheInitService implements InitializingBean {
private static Logger logger = LoggerFactory.getLogger(CacheInitService.class);
// 獲取所有需要初始化的服務
@Autowired
private List<CacheInitiator> cacheInitiators;
@Override
public void afterPropertiesSet() throws Exception {
logger.info("-------初始化緩存start------");
if(cacheInitiators!=null){
// 遍歷調用初始化服務的init方法
cacheInitiators.parallelStream().forEach(c -> c.init());
}
logger.info("-------初始化緩存end--------耗時(ms):"+timer.interval());
}
}
3、這裏使用第三種方式實現初始化調用結果如下:
以上在啓動服務時調用了我們需要的方法
4、學海無涯苦作舟,慢慢積累,慢慢沉澱,是金子總會發光。