spring各个注解执行顺序
2021-06-07 本文已影响0人
风一样的存在
当时想在启动后初始化一个上下文,但是发现后面获取上下文赋值得到的值一直是null。debug发现代码执行顺序有问题,我加了@Oder还是没用,获取的appInfo一直为null。
@Component
@Order(value = 1)
public class UpgradeRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
String path = System.getProperty("user.dir");
String filePath = path + File.separator + "version.txt";
//项目启动初始化应用信息
UpgradeContext.appInfo = JSON.parseObject(FileUtil.readUtf8String(filePath), RunInfo.class);
IOFileFilter files = FileFilterUtils.and(FileFilterUtils.fileFileFilter(),
FileFilterUtils.nameFileFilter("version.txt"));
FileAlterationObserver observer = new FileAlterationObserver(new File(path),files);
observer.addListener(new FileListener());
//创建文件变化监听器
FileAlterationMonitor monitor = new FileAlterationMonitor(TimeUnit.MINUTES.toMillis(2), observer);
//开始监控文件变化
monitor.start();
}
}
@Slf4j
@Service
public class UpgradeService {
@Autowired
private AppConfig config;
@Autowired
private OkHttpUtil okHttpUtil;
private String credential;
private RunInfo appInfo;
@PostConstruct
public void init() {
this.credential = Credentials.basic(config.getTokenUser(), config.getTokenPass(), StandardCharsets.UTF_8);
this.appInfo = UpgradeContext.appInfo;
}
}
经过测试:执行顺序@PostConstruct > InitializingBean > ApplicationRunner。当然也可以使用spring监听事件初始化一些操作:
- ApplicationStartingEvent:在Spring最开始启动的时候触发
- ApplicationEnvironmentPreparedEvent:在Spring已经准备好上下文但是上下文尚未创建的时候触发
- ApplicationPreparedEvent:在Bean定义加载之后、刷新上下文之前触发
- ApplicationStartedEvent:在刷新上下文之后、调用application命令之前触发
- ApplicationReadyEvent:在调用applicaiton命令之后触发
-
ApplicationFailedEvent:在启动Spring发生异常时触发
另外:ApplicationRunner和CommandLineRunner的执行在第五步和第六步之间,Bean的创建在第三步和第四步之间;在启动类中,执行SpringApplication.run()方法后的代码,会在第六步后执行。