Spring Boot中的类初始化方法的执行先后顺序

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Spring Boot中的类初始化方法的执行先后顺序,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

各种类初始化方法的执行先后顺序

已验证这六种方法初始化的先后顺序如下:

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!