• Spring的ApplicationContextInitializer


    ApplicationContextInitializer

    Spring应用程序启动时,ApplicationContextInitializer会在ApplicationContext被创建之前执行。它的主要作用是在ApplicationContext被创建之前对其进行自定义配置,例如设置环境变量、添加自定义的BeanDefinition等,以便在ApplicationContext被创建后,应用程序可以使用这些自定义配置。

    ApplicationContextInitializer的执行顺序是在Spring容器启动的早期阶段,它会在Spring容器的refresh()方法之前执行。这意味着在ApplicationContextInitializer执行之前,Spring容器的Bean定义还没有被加载,也没有被实例化。

    ApplicationContextInitializer接口中只有一个方法:initialize(ConfigurableApplicationContext applicationContext),该方法在Spring容器启动时被调用,接收一个ConfigurableApplicationContext类型的参数,该参数表示正在启动的ApplicationContext。在该方法中,我们可以对ApplicationContext进行一些自定义的初始化操作,例如:

    1. 设置环境变量:可以通过applicationContext.getEnvironment()获取到当前ApplicationContext的环境变量,然后进行一些自定义的设置。
    
    2. 添加自定义的BeanDefinition:可以通过applicationContext.getBeanFactory()获取到当前ApplicationContextBeanFactory,然后通过BeanDefinitionRegistry接口添加自定义的BeanDefinition3. 注册自定义的BeanPostProcessor:可以通过applicationContext.addBeanFactoryPostProcessor()方法注册自定义的BeanPostProcessor
    • 1
    • 2
    • 3
    • 4
    • 5

    总之,ApplicationContextInitializer接口可以让我们在Spring容器启动时对ApplicationContext进行一些自定义的初始化操作,从而实现更加灵活的配置和扩展。


    Spring容器和ApplicationContext的关系

    ApplicationContext是Spring框架中的一个接口,它是Spring容器的一种实现。Spring容器是一个管理Bean的容器,它负责创建、管理和销毁Bean对象。ApplicationContext是Spring容器的一种实现,它提供了更多的功能和特性,比如国际化、事件传递、资源加载等。

    在Spring中,ApplicationContext是一个非常重要的接口,它是整个Spring框架的核心。ApplicationContext接口提供了一种机制,可以将Bean的定义和配置信息从Java代码中分离出来,从而实现了松耦合的设计。通过ApplicationContext,我们可以将Bean的定义和配置信息存储在XML文件中,然后通过Spring容器来加载和管理这些Bean对象。

    Spring容器提供了多种实现方式,包括ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebApplicationContext等。这些实现方式都是基于ApplicationContext接口的,它们提供了不同的功能和特性,可以根据不同的需求来选择合适的实现方式。

    总之,ApplicationContext是Spring容器的一种实现,它提供了更多的功能和特性,可以帮助我们更好地管理和使用Bean对象。


    Spring容器的refresh()方法的作用

    Spring容器的refresh()方法是用来刷新容器的,它的作用是重新加载所有的bean定义,重新实例化所有的单例bean,并且将它们注入到其他bean中。

    具体来说,refresh()方法会执行以下操作:

    1. 创建一个新的BeanFactory,并将所有的bean定义加载到该工厂中。
    
    2. 实例化所有的非懒加载的单例bean,并将它们注入到其他bean中。
    
    3. 触发所有的BeanPostProcessorpostProcessBeforeInitialization()方法,对所有的bean进行前置处理。
    
    4. 初始化所有的非懒加载的单例bean,并将它们注入到其他bean中。
    
    5. 触发所有的BeanPostProcessorpostProcessAfterInitialization()方法,对所有的bean进行后置处理。
    
    6. 触发所有的ApplicationListeneronApplicationEvent()方法,处理所有的事件。
    
    7. 完成容器的刷新,容器可以开始处理请求。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    总之,refresh()方法是Spring容器的核心方法之一,它负责将所有的bean定义加载到容器中,并将它们实例化、初始化和注入到其他bean中,从而使得整个应用程序能够正常运行。


    ApplicationContextInitializer接口示例代码

    public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    
        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            // 设置系统属性
            System.setProperty("my.property", "my-value");
    
            // 注册一个Bean
            applicationContext.getBeanFactory().registerSingleton("myBean", new MyBean());
    
    		// 添加环境变量
    		MutablePropertySources propertySources = applicationContext.getEnvironment().getPropertySources();
            try {
                Resource resource = new ClassPathResource("my.properties");
                ResourcePropertySource propertySource = new ResourcePropertySource(resource);
                propertySources.addLast(propertySource);
            } catch (Exception e) {
                // 处理异常
            }
    		
        }
    
        private static class MyBean {
            // ...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    配置到spring.factories

    在resources 下 META-INF文件夹下加上 spring.factories文件,配置

    org.springframework.context.ApplicationContextInitializer=com.luxifa.config.MyApplicationContextInitializer

  • 相关阅读:
    Python基于OpenCV的视频车道线检测系统[源码&部署教程]
    SpringBoot Web请求响应
    leetcode做题笔记168. Excel表列名称
    Au 入门系列之一:认识 Audition
    基于JAVA新生报到管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    一些动态几何问题的流式算法
    从 C 到 C++ 编程 — 基于 template 的泛型编程
    原生js--购物车案例
    ICLR24大模型提示(1/11) | BadChain:大型语言模型的后门思维链提示
    【Java】使用stream()串行和并行流,代替for循环一行写完
  • 原文地址:https://blog.csdn.net/weixin_42594143/article/details/133344218