Spring Environment Abstraction

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Spring Environment Abstraction

Spring Environment Abstraction

在spring中,properties和profile是Environment abstraction 的两个核心, 作为一个整体模块整合到了Spring container中,Environment abstraction是ApplicationContext的核心功能之一.

profile是关注的不同环境或者说组,比如说我们会用的到的不同环境,dev,beta,prod等,也可能是根据功能来区分不同的组,不同的profile下使用不同的property.

property再熟悉不过,代表了配置文件或者说是资源文件,在所有的应用中都扮演着重要的角色,它的具体表示形式可以有多种多样:

  • properties files
  • JVM system properties
  • system environment variables
  • JVM system properties

    Environment API的主要功能就是解析这些不同的属性文件,为应用提供统一的使用方式

    Spring Environment Abstraction

    Environment API的特性如下:

    Spring Environment Abstraction

    在spring中,PropertySource是一个抽象类,代表了最小粒度的属性单位,用key-value 一个键值对来表示.

    Spring Environment Abstraction

    PropertySource代表一个属性,PropertySources代表一组属性,而MutablePropertySources则代表了有先后顺序的多组属性,它们的组织形式如下:

    Spring Environment Abstraction

    Environment作为对所有属性管理者,它的主要功能和逻辑是在其抽象实现类AbstractEnvironement中.

    Spring Environment Abstraction

    这两个方法的功能通过方法名可知是获取系统变量属性和系统属性(java -jar -Dxxx=aaa).另外有一个重要的方便扩展的方法

    customizePropertySources

    AbstractEnvironment的各种扩展类是通过这个方法来设置自定义资源的.

    Spring Environment Abstraction

    StandardEnvironement

    Spring Environment Abstraction

    而StandardServletEnvironement还加载了Servlet相关的属性

    Spring Environment Abstraction

    Environement模块的整体组织结构

    Spring Environment Abstraction

    上边分别描述这整个模块中各个类的功能职责,下边从spring mvc启动时的逻辑来串联一下Environment是如何被容器初始化的.

    Web容器启动第一步,必须会调用ContextLoader(是通过ContextLoaderListener触发的)

    在ContextLoader中的方法中initWebApplicationContext

    调用configureAndRefreshWebApplicationContext方法

    Spring Environment Abstraction

    调用getEnvironment方法

    Spring Environment Abstraction Spring Environment Abstraction

    createEnvironement

    Spring Environment Abstraction

    这样,新创建的StandardServletEnvironment会返回给web容器.

    到这里,貌似只有环境变量的属性和系统变量的属性有了,那么用户自定义的配置文件是如何加载的呢

    PropertySourcesPlaceholderConfigurer这个类是关键

    它作为BeanFactoryPostProcessor(bfpp)扩展点的一个实现,在beanFacotry初始化的过程过,作了如下逻辑

    Spring Environment Abstraction

    可以看到,第一步,把environment加到propertySources里;第二步,加载localProperty即用户的自定义属性文件,跟进mergeProperteis方法

    Spring Environment Abstraction Spring Environment Abstraction

    注意locations是我们在配置中指定的属性文件路径列表

    Spring Environment Abstraction

    而PropertiesLoaderUtils.fillProperties(xxx)方法则是具体的读取并解析属性文件的逻辑

    Spring Environment Abstraction

    往下不再继续跟,看官可以自己去跟.

    到这里简单介绍了spring中的属性文件的表现方式和加载方式,其中涉及的细节较多,一些概念在以往的文章有提到,感兴趣的可查看历史消息.

    为了更好的展示代码,不至于格式走样,本文图片较多,非wifi酌情观看,希望文章内容对得起看官们的流量,吼吼

    Thx for read

    Spring Environment Abstraction

    SpringAutowired

    一个有用的公众号

    Spring Environment Abstraction

    长按,识别二维码,加关注

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> Spring Environment Abstraction


     上一篇
    Spring 重试机制实现原理 Spring 重试机制实现原理
    重试,我们都不陌生,是为了保障逻辑容错性和可用性的一种机制。一般在网络通信组件底层比较常见,比如网络连接操作,如果有网络中断时,一般需要重试几次。 在上层的业务代码里,如果我们需要对某个特定操作加入重试机制,可以硬编码,然后循环调
    2021-04-05
    下一篇