Spring Boot中的类初始化方法的执行先后顺序
各种类初始化方法的执行先后顺序
已验证这六种方法初始化的先后顺序如下:
SpringApplication
> ServletContextListener
> InitializingBean
> PostConstruct
> ApplicationRunner
> CommandLineRunner
main方法
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
System.out.println("****************** DemoApplication.run before ******************");
SpringApplication.run(DemoApplication.class, args);
System.out.println("****************** DemoApplication.run after ******************");
}
}
实现ServletContextListener接口
ServletContextListener接口用于服务启动时自动加载函数,需加载的类必须实现ServletContextListener接口,且重写该接口中的两个方法。
public interface ServletContextListener extends EventListener {
// 服务器起动时加载内容
default void contextInitialized(ServletContextEvent sce) {
}
// 服务器关闭时加载的内容
default void contextDestroyed(ServletContextEvent sce) {
}
}
@Component
public class TestServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("****************** TestServletContextListener.contextInitialized() ******************");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("****************** contextInitialized.contextDestroyed() ******************");
}
}
实现InitializingBean接口
InitializingBean接口为bean提供了属性初始化后的处理方法,只拥有一个afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法。
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
@Component
public class TestInitializingBean implements InitializingBean {
@Override
public void afterPropertiesSet() {
System.out.println("****************** TestInitializingBean.afterPropertiesSet() ******************");
}
}
@PostConstruct注解
@PostConstruct
注解是Java Jdk提供的注解,Java EE5引入了@PostConstruct
和@PreDestroy
两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作。
@Component
public class TestPostConstruct {
@PostConstruct
public void init(){
System.out.println("****************** TestPostConstruct.init() ******************");
}
}
实现ApplicationRunner
ApplicationRunner、CommandLineRunner
常用于服务启动的时候执行一些任务,如读取配置文件,Redis数据预热等操作。
ApplicationRunner的run方法的参数为ApplicationArguments,是对main方法的args原始参数做了进一步的封装。
@Component
public class TestApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("****************** TestApplicationRunner.run() ******************");
}
}
实现CommandLineRunner
ApplicationRunner、CommandLineRunner
常用于服务启动的时候执行一些任务,如读取配置文件,Redis数据预热等操作。
CommandLineRunner接口中run方法的参数为String数组。多个CommandLineRunner可以被同时执行在同一个spring上下文中并且执行顺序是以order注解的参数顺序一致。
@Component
public class TestCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) {
System.out.println("****************** TestCommandLineRunner.run() ******************");
}
}
执行结果
执行结果如下:
****************** DemoApplication.run before ******************
****************** DemoApplication.run before ******************
****************** TestServletContextListener.contextInitialized() ******************
****************** TestInitializingBean.afterPropertiesSet() ******************
****************** TestPostConstruct.init() ******************
****************** TestApplicationRunner.run() ******************
****************** TestCommandLineRunner.run() ******************
****************** DemoApplication.run after ******************
****************** contextInitialized.contextDestroyed() ******************
注意:DemoApplication.run before
执行2次是因为pom文件引入了热部署的Jar包引起的,将其删除或者注释即可解决打印两次的问题。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136856.html