在日常开发中,我们经常会遇到在项目启动阶段要做一些数据初始化等操作,并且只在项目启动时进行,后续不再执行。而在SpringBoot2.x中,可根据不同使用场景使用不同的方式去实现该功能。具体如下:
启动任务常用场景:
/**
* 功能描述: CommandLineRunner实现启动任务
* @author TuYong
* @date 2022/6/14 14:16
*/
@Component
@Order(100)
@Slf4j
public class InitCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
log.info("读取String数组参数初始化操作内容...");
}
}测试结果如下:
在 IDEA 中,可以通过如下方式来配置参数
启动项目后,我们可以看到启动过程中run方式被执行。
代码如下,自定义类InitApplicationRunner实现 ApplicationRunner 接口即可。用法同CommandLineRunner一致,ApplicationRunner 可以接收更多类型的参数(ApplicationRunner 除了可以接收 CommandLineRunner 的参数之外,还可以接收 key/value 形式的参数)。具体获取参数方法如下:
/**
* 功能描述: ApplicationRunner实现启动任务
* @author TuYong
* @date 2022/6/14 14:31
*/
@Component
@Order(99)
@Slf4j
public class InitApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
//获取命令行中的无key参数
List nonOptionArgs = args.getNonOptionArgs();
log.info("InitApplicationRunner无key参数:{}",nonOptionArgs);
//获取所有key/value形式的参数的key
Set optionNames = args.getOptionNames();
for (String key : optionNames) {
//根据key获取key/value 形式的参数的value
log.info("InitApplicationRunner有key参数:{}",args.getOptionValues(key));
}
//获取命令行中的所有参数
String[] sourceArgs = args.getSourceArgs();
log.info("InitApplicationRunner所有参数:{}",Arrays.toString(sourceArgs));
}
}
测试结果如下:
在 IDEA 中,可以通过如下方式来配置参数
启动项目,可以看到控制台打印如下:
定义义一个 ServletContextListener,在contextInitialized方法中进行数据初始化操作即可。
@Component
@Slf4j
public class InitServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//这里编写启动任务代码
log.info("监听器初始化.....");
}
}
测试结果如下:
示例代码如下,被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。
创建bean的时候执行顺序
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
需要注意的是:
/**
* 功能描述: 基于@PostConstruct实现启动任务
* @author TuYong
* @date 2022/6/14 14:59
*/
@Service
@Slf4j
public class SysParamService {
@PostConstruct
public void initParam(){
//编写业务逻辑代码,比如从数据库查询系统参数放入缓存中
log.info("初始化系统参数......");
}
}
测试结果如下
示例代码如下:
/**
* 功能描述: 基于InitializingBean实现启动任务
* @author TuYong
* @date 2022/6/14 15:25
*/
@Component
@Slf4j
public class MyInitializingBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
//编写启动任务代码
log.info("InitializingBean 执行初始化任务...");
}
}
测试结果如下
| 留言与评论(共有 0 条评论) “” |