ApplicationListener 是由 spring-context组件提供的一个接口,主要是用来监听 "容器上下文的生命周期事件"。它的定义如下:
这里的event可以是任何一个继承于ApplicationEvent的事件对象。对于初始化工作来说,我们可以通过监听ContextRefreshedEvent这个事件来捕捉上下文初始化的时机。如下面的代码:
在Spring上下文初始化完成后,这里定义的方法将会被执行。与前面的InitializingBean不同的是,通过ApplicationListener监听的方式是全局性的,也就是当所有的Bean都初始化完成后才会执行方法。
Spring 4.2 之后引入了新的 @EventListener注解,可以实现同样的效果:
6、 CommandLineRunner
SpringBoot 提供了一个CommanLineRunner接口,用来实现在应用启动后的逻辑控制,其定义如下:
这里的run方法会在Spring 上下文初始化完成后执行,同时会传入应用的启动参数。如下面的代码:
此外,对于多个CommandLineRunner的情况下可以使用@Order注解来控制它们的顺序。
7、 ApplicationRunner
与CommandLineRunner接口类似, Spring boot 还提供另一个ApplicationRunner 接口来实现初始化逻辑。不同的地方在于 ApplicationRunner.run()方法接受的是封装好的ApplicationArguments参数对象,而不是简单的字符串参数。
ApplicationArguments对象提供了一些非常方便的方法,可以用来直接获取解析后的参数,比如:
java -jar application.jar --debug --ip=xxxx
此时通过 ApplicationArguments的getOptionNames就会得到["debug","ip"]这样的值。
测试代码
下面,通过一个小测试来演示几种初始化方法的执行次序。
按如下代码实现一个复合式的Bean:
执行这个Bean的初始化,会发现日志输出如下:
所以,这几种初始化的顺序为:
1.