• Springboot普通类获取运行时环境,获取运行时容器,获取Bean,等等获取运行时一切参数总结大全


    获取ApplicationContext

    ApplicationContext有什么用

    ApplicationContext为应用程序提供配置的中央接口。在应用程序运行时,这是只读的,但如果实现支持这一点,则可以重新加载。所以,因为获取到的ApplicationContext是不可变的,通常定义一个工具类,将其封装好直接拿来用即可。

    ApplicationContext提供:

    • 用于访问应用程序组件的Bean工厂方法。继承自ListableBeanFactory。
    • 以通用方式加载文件资源的能力。继承自org.springframe .core.io. resourceloader接口。
    • 向注册的侦听器发布事件的能力。继承自ApplicationEventPublisher接口。
    • 解析消息的能力,支持国际化。从MessageSource接口继承。
    • 从父上下文继承。后代上下文中的定义总是具有优先级。这意味着,例如,单个父上下文可以被整个web应用程序使用,而每个servlet都有自己的子上下文,子上下文独立于任何其他servlet的子上下文。
    • 除了标准的生命周期功能外,ApplicationContext实现检测并调用applicationcontextware bean以及ResourceLoaderAware、ApplicationEventPublisherAware和MessageSourceAware bean。

    获取ApplicationContext

    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    // 注意!这个@Component是一定要加的
    @Component
    public class ApplicationContextUtils implements ApplicationContextAware {
    
        private static ApplicationContext applicationContext;
    
        /**
         * 实现ApplicationContextAware的setApplicationContext方法,获取到ApplicationContext
         */
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        /**
         * 取得存储在静态变量中的ApplicationContext.
         */
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
    }
    
    
    • 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
    • 27

    此时我们可以在普通类中直接ApplicationContextUtils.getApplicationContext(),就可以获取ApplicationContext了,不需要额外注入这个ApplicationContextUtils。

    或者每个需要使用ApplicationContext 的类,各自实现ApplicationContextAware接口,拿到ApplicationContext也是可以的。

    获取Environment

    某个bean,实现EnvironmentAware接口,就可以得到运行的环境了。

    Environment有什么用

    Environment接口,表示当前应用程序运行的环境。建模应用程序环境的两个关键方面:概要文件和属性。与属性访问相关的方法通过PropertyResolver超接口公开。

    概要文件是一个命名的、逻辑的bean定义组,仅当给定的概要文件是活动的时才向容器注册。可以将bean分配给配置文件,无论是在XML中定义的还是通过注释定义的。与概要文件相关的Environment对象的作用是确定哪些概要文件(如果有的话)当前是活动的,以及哪些概要文件(如果有的话)在默认情况下应该是活动的。

    属性在几乎所有应用程序中都扮演着重要的角色,并且可能来自各种来源:属性文件、JVM系统属性、系统环境变量、JNDI、servlet上下文参数、特别的Properties对象、映射等等。与属性相关的环境对象的作用是为用户提供一个方便的服务接口,用于配置属性源并从中解析属性。

    在ApplicationContext中管理的bean可以注册为EnvironmentAware或@Inject the Environment,以便查询概要文件状态或直接解析属性。

    然而,在大多数情况下,应用程序级bean不应该需要与环境直接交互,而是可能必须具有${…}属性值被属性占位符配置器替换,例如PropertySourcesPlaceholderConfigurer,它本身是EnvironmentAware的,并且从Spring 3.1开始在使用 时默认注册。

    环境对象的配置必须通过ConfigurableEnvironment接口完成,该接口从所有AbstractApplicationContext子类getEnvironment()方法返回。

    获取Environment

    import org.springframework.context.EnvironmentAware;
    import org.springframework.core.env.Environment;
    import org.springframework.stereotype.Component;
    
    // 一定要加@Component
    @Component
    public class EnvironmentUtils implements EnvironmentAware {
    
        private static Environment environment;
    
    
        /**
         * 实现EnvironmentAware的setEnvironment方法,可以使bean获取到运行时的环境
         */
        @Override
        public void setEnvironment(Environment environment) {
            this.environment = environment;
        }
    
        /**
         * 取得存储在静态变量中的Environment
         */
        public static Environment getEnvironment() {
            return environment;
        }
    
    }
    
    • 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
    • 27

    获取BeanFactory

    BeanFactory有什么用

    BeanFactory是访问Spring bean容器的根接口。

    该接口由包含许多bean定义的对象实现,每个bean定义由String名称唯一标识。根据bean定义,工厂将返回包含对象的独立实例(Prototype设计模式)或单个共享实例(Singleton设计模式的高级替代方案,其中实例在工厂范围内是单个实例)。返回哪种类型的实例取决于bean工厂配置:API是相同的。自Spring 2.0以来,根据具体的应用程序上下文(例如:"request"和"session"作用域)。

    Bean工厂实现应该尽可能支持标准的Bean生命周期接口。完整的初始化方法集及其标准顺序为:
    BeanNameAware的setBeanName
    BeanClassLoaderAware的setBeanClassLoader
    BeanFactoryAware的setBeanFactory
    EnvironmentAware的setEnvironment
    EmbeddedValueResolverAware的setEmbeddedValueResolver
    ResourceLoaderAware的setResourceLoader(仅适用于在应用程序上下文中运行时)
    ApplicationEventPublisherAware的setApplicationEventPublisher(仅适用于在应用程序上下文中运行时)
    MessageSourceAware的setMessageSource(仅适用于在应用程序上下文中运行时)
    ApplicationContextAware的setApplicationContext(仅适用于在应用程序上下文中运行时)
    ServletContextAware的setServletContext(仅适用于在web应用程序上下文中运行时)
    BeanPostProcessors的postProcessBeforeInitialization方法
    InitializingBean的afterPropertiesSet

    自定义的初始化方法定义
    BeanPostProcessors的postProcessAfterInitialization方法

    在关闭bean工厂时,应用以下生命周期方法:
    DestructionAwareBeanPostProcessors的postProcessBeforeDestruction方法
    DisposableBean的破坏
    自定义的销毁方法定义

    获取BeanFactory

    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.BeanFactoryAware;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Test implements BeanFactoryAware {
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            // 获取了beanFactory
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

  • 相关阅读:
    华为机试 - 目录删除
    Redis 三种特殊的数据类型 - Geospatial地理位置 - Hyperloglog基数统计的算法 - Bitmaps位图(位存储)
    使用VisualStudio2022制作安装包
    vivado查看报告和消息4
    【数据结构与算法】之深入解析“乘法表中第K小的数”的求解思路与算法示例
    Python:不要在循环中删除元素
    java关于wait()和notify()方法
    vue2+elementUI 仿照SPC开发CPK分析工具
    Windows安装redis
    微服务同时接入多个Kafka
  • 原文地址:https://blog.csdn.net/A_art_xiang/article/details/127889627