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、这里使用第三种方式实现初始化调用结果如下:
以上在启动服务时调用了我们需要的方法
4、学海无涯苦作舟,慢慢积累,慢慢沉淀,是金子总会发光。