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、学海无涯苦作舟,慢慢积累,慢慢沉淀,是金子总会发光。

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