spring項目--啓動項目調用特定方法的三種實現方式

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、學海無涯苦作舟,慢慢積累,慢慢沉澱,是金子總會發光。

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