properties 文件解析
写在前面: 是因为 username 的问题,之前用的 liunx 系统然后换成 win 后,properties 文件中的 username 就解析成操作系统的用户名了。其实也简单,换一个 key 就好,只是我比较想知道是哪儿做的操作。
简单配置
- properties 文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/x?useUnicode=true&characterEncoding=utf8&useSSL=true&allowMultiQueries=true
username=root
password=123456
- xml 文件
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<bean/>
介于第一次写关于源码相关的博客,就多啰嗦一点儿。 点击标签 (
context:property-placeholder),然后在对应的 jar 包的META-INF/spring.handlers文件中就可以找到有关标签的处理类,这里是PropertySourcesPlaceholderConfigurer。
结构图如下:

可以看出实现了 BeanFactoryPostProcessor 接口,所以这个类会在容器初始化的时候会被调用,此时就会把项目中定义的 properties 文件的属性 add 到 propertySources 中,通过打断点可以看出来此时 propertySources 已经在上面的步骤中添加了一个 key 为 environmentProperties值了,我们添加的为 key 为 localProperties。(这里这么说,其实太严谨,不过一打端点就能看明白了)。
然后,是关于 environmentProperties 的添加。这里是 org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions() 方法中第一行代内 new StandardEnvironment() 时,由 StandardEnvironment 的父类创建并保存在 AbstractBeanDefinitionReader.environment 属性中。
源码如下:

最后 : environmentProperties 中:通过 System.getProperties() 和 System.getenv() 两个方法获取值。

本文介绍了解析Spring框架中properties配置文件的过程,特别是针对环境变量覆盖默认配置的情况。通过跟踪源码,展示了如何处理属性文件中的变量,并解释了环境变量如何被读取及应用。
1034

被折叠的 条评论
为什么被折叠?



