首页 > 其他分享 >Spring启动初始化策略对比

Spring启动初始化策略对比

时间:2024-11-29 11:22:20浏览次数:6  
标签:初始化 Spring springframework 对比 import org public

很多时候我们需要在启动时就加载些资源,初始化一些内容。比如一些大数据的常用内容,或许要提前就加载到redis里,或者本地caffeine缓存里等各类实际场景的需求和做法,此时我们就需要考虑下什么时候该准备好

一:先说几个简单常见常用的

@PostConstruct 注解方式;实现 CommandLineRunner 接口方式

他们都是在 Spring Boot 应用程序启动时用于执行初始化逻辑的两种方法,但它们的用法和生命周期稍有不同

  1. @PostConstruct:

    • @PostConstruct 是 Java 的标准注解,由 JSR-250 定义,用于在依赖注入完成后立即执行初始化方法。
    • 当 Spring 完成Bean的实例化、配置和注入以后,就会调用@PostConstruct标注的方法。
    • 用于需要在该 Bean 初始化完成(即依赖注入完成)后立即执行的逻辑。
    • 注解在类的一个方法上,该方法无参数且返回值为 void
    @Component
    public class SomeComponent {
    
        @PostConstruct
        public void init() {
            // 初始化逻辑
        }
    }
    
  2. CommandLineRunner:

    • CommandLineRunner 是 Spring Boot 提供的一个接口,用于在 Spring Boot 应用程序启动后执行一些代码。
    • 应用程序启动并且 Spring 容器创建和刷新完成后,会执行实现 CommandLineRunner 接口的 run 方法。
    • 主要用于在应用程序启动之后,但在 Spring Boot 应用完全就绪之前(例如从命令行读取参数、执行启动时任务)。
    @Component
    public class MyCommandLineRunner implements CommandLineRunner {
    
        @Override
        public void run(String... args) throws Exception {
            // 初始化逻辑
        }
    }
    
  3. 生命周期区别

    • @PostConstruct 在 Spring 容器创建和配置所有 Bean 的过程中发生的。此时Spring bean容器的所有bean还没有完全初始化并就绪
    • CommandLineRunner 在所有 Spring Beans 被完全初始化并就绪后执行,但在 Spring Boot 应用完全就绪之前。这意味着它会在应用启动的最后阶段运行
    • 因此,@PostConstruct 方法会比 CommandLineRunner 更早执行

二:一些其他方式

  1. ApplicationRunner:

    • 用途: 与 CommandLineRunner 类似,但提供了更丰富的应用参数处理能力。
    • 实现方式: 实现 ApplicationRunner 接口,并重写 run(ApplicationArguments args) 方法。
    • 代码示例:
      import org.springframework.boot.ApplicationArguments;
      import org.springframework.boot.ApplicationRunner;
      import org.springframework.stereotype.Component;
      
      @Component
      public class MyApplicationRunner implements ApplicationRunner {
          @Override
          public void run(ApplicationArguments args) {
              // 获取应用程序参数
              System.out.println("ApplicationRunner executed!");
          }
      }
      
  2. InitializingBean:

    • 用途: 提供了一种基于接口的方式,在 Spring 完成 Bean 属性设置后执行自定义初始化逻辑,也就是依赖注入完成之后被调用
    • 实现方式: 实现 InitializingBean 接口,并重写 afterPropertiesSet() 方法。
    • 代码示例:
      import org.springframework.beans.factory.InitializingBean;
      import org.springframework.stereotype.Component;
      
      @Component
      public class MyInitializingBean implements InitializingBean {
          @Override
          public void afterPropertiesSet() throws Exception {
              System.out.println("InitializingBean executed after properties set!");
          }
      }
      
  3. @EventListener注解 和 ApplicationListener:

    • 用途: 监听 Spring 应用上下文事件,如 ApplicationReadyEvent,并在事件触发后执行逻辑。

    • @EventListener 实现方法:

      import org.springframework.context.event.EventListener;
      import org.springframework.stereotype.Component;
      import org.springframework.boot.context.event.ApplicationReadyEvent;
      
      @Component
      public class MyEventListener {
      
          @EventListener
          public void onApplicationReady(ApplicationReadyEvent event) {//当然你也可以自定义一个方法名,参数类,比如继承ApplicationEvent的子类来实现业务关联的字段内容等
              System.out.println("Application is ready!");
          }
      }
      
    • ApplicationListener 实现方法:

      import org.springframework.context.ApplicationListener;
      import org.springframework.context.event.ContextRefreshedEvent;
      import org.springframework.stereotype.Component;
      
      @Component
      public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
          @Override
          public void onApplicationEvent(ContextRefreshedEvent event) {
              System.out.println("Context refreshed!");
          }
      }
      
  4. @Scheduled:

    • 用途: 用于定时任务,但可以配置为在启动时执行。
    • 实现方式: 配置一个只执行一次的定时任务。
    • 代码示例:
      import org.springframework.scheduling.annotation.Scheduled;
      import org.springframework.stereotype.Component;
      
      @Component
      public class MyScheduledTask {
          @Scheduled(initialDelay = 0, fixedDelay = Long.MAX_VALUE)
          public void onStartup() {
              System.out.println("Scheduled task executed on startup!");
          }
      }
      
  5. Bean Initialization Methods:

    • 用途: 使用配置文件或注解指定 Bean 的初始化方法。
    • 实现方式:
      • XML 配置:
        <bean id="myBean" class="com.example.MyBean" init-method="init"/>
        
      • Java 配置:
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        
        @Configuration
        public class AppConfig {
            @Bean(initMethod = "init")
            public MyBean myBean() {
                return new MyBean();
            }
        }
        
  6. ApplicationContextInitializer:

    • 用途: 在 Spring 应用上下文刷新之前进行初始化。
    • 实现方式: 实现 ApplicationContextInitializer 接口,并在应用启动配置中注册。
    • 代码示例:
      import org.springframework.context.ApplicationContextInitializer;
      import org.springframework.context.ConfigurableApplicationContext;
      
      public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
          @Override
          public void initialize(ConfigurableApplicationContext context) {
              System.out.println("ApplicationContextInitializer executed!");
          }
      }
      
    • 注册方法(通常在 SpringApplication 中):
      import org.springframework.boot.SpringApplication;
      
      public class MySpringApplication {
          public static void main(String[] args) {
              SpringApplication app = new SpringApplication(MySpringApplication.class);
              app.addInitializers(new MyApplicationContextInitializer());
              app.run(args);
          }
      }
      

三:简述下顺序

鉴于上面的内容,简单概述下部分顺序

  1. Spring Boot 启动

    • Spring Boot 应用开始启动,启动类一般是一个带有 @SpringBootApplication 注解的类。
  2. Spring 容器初始化

    • Spring 应用上下文(ApplicationContext)被创建并初始化。
    • 所有 Spring Beans 被实例化、依赖注入、初始化的过程。
    • 如果 某些 Bean 实现了 InitializingBean 接口或使用了 @PostConstruct 注解,则执行相关初始化逻辑。
  3. Commands 执行 (CommandLineRunner and ApplicationRunner)

    • CommandLineRunnerApplicationRunner 实例的 run() 方法被调用。
    • 这是你可以在应用启动时执行定制逻辑的地方,比如清理或加载初始数据、启动后台任务等。
    • CommandLineRunner 接收从命令行传递到应用的参数,这些参数可以用于配置启动行为。
  4. Spring Boot 应用准备就绪

    • 事件如 ApplicationReadyEvent 被发布,表示应用程序完全准备好接受请求或执行其他业务操作。

因此,CommandLineRunner 提供了一个合适的钩子,在你想在应用程序完全启动并准备好对外提供服务之前,执行自定义代码或准备工作时使用。
简单常用的基本是@PostConstruct,CommandLineRunner或ApplicationRunner

标签:初始化,Spring,springframework,对比,import,org,public
From: https://www.cnblogs.com/jhfnewstart/p/18576195

相关文章

  • 软件许可证Apache 2.0、GPL 和 MIT对比
    开源软件许可证的选择通常由项目的目标和使用场景决定。在实际开发中,不同的许可证(如Apache2.0、GPL和MIT)已被大规模使用在各类流行项目上。以下是基于这些许可证的大型开源项目的总结和对比,包括常用的.NET库(如Newtonsoft.Json、AutoMapper、依赖注入框架等)以及其他行业内的......
  • Spring基础
    以往开发是使用以下代码,代码耦合性太高。每当用户需要改变需求,都需要我们更改对象。所以我们需要一些方法去降低耦合度。privateAdminDaoadminDao=newAdminDaoImpl();1.依赖<!--https://mvnrepository.com/artifact/org.springframework/spring-webmvc--><dependency......
  • HarmonyOS Next 与安卓开发对比及迁移指南
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)与安卓开发的对比,并提供迁移指南。基于实际开发实践进行总结,主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。第一章:技术......
  • SpringBoot 架构下夕阳红公寓智能化管理系统的匠心构建
    1绪论1.1课题背景二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。时代进步的标志,就是让人们过上更好的生活。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的传播速度极慢,信息处理的速度和要求还是通过人......
  • 基于 SpringBoot 的夕阳红公寓全方位管理系统:设计蓝图与实践成果
    1绪论1.1课题背景二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。时代进步的标志,就是让人们过上更好的生活。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的传播速度极慢,信息处理的速度和要求还是通过人......
  • 无需配对数据的对比学习图像到图像转换,助力跨域物体检测 | BMVC'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:ImprovingObjectDetectionviaLocal-globalContrastiveLearning论文地址:https://arxiv.org/abs/2410.05058论文代码:https://local-global-detection.github.io/创新点提出了一种新颖的图像到图像转换方法,用于......
  • 计算机毕设-基于springboot的在线车辆租赁信息管理系统的设计与实现(附源码+lw+ppt+开
    博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫+大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战项目。主要内容:系......
  • 基于springboot的厨艺交流平台的设计与实现代码
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......
  • springboot大型商场应急预案管理系统
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......
  • 基于SpringBoot+Vue的火锅店管理系统+万字论文+Mp4演示
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!!......