欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring项目--启动项目调用特定方法的三种实现方式

程序员文章站 2022-06-08 12:18:18
...

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、这里使用第三种方式实现初始化调用结果如下:

spring项目--启动项目调用特定方法的三种实现方式

以上在启动服务时调用了我们需要的方法

4、学海无涯苦作舟,慢慢积累,慢慢沉淀,是金子总会发光。