java - Spring如何在内存中加载属性文件?
问题描述
我对春天真的很陌生,所以请不要生气,忍受我一会儿。
我试图了解如何或任何其他外部配置文件值与提到application.properties
配置文件的键 () 以从文件本身使用它们的值的位置相关联。value="${log4j.configuration}"
例如下面是spring bean xml文件:
<bean id = "propertiesToBeTaken"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:application.properties</value>
<value>classpath*:*keys.properties</value>
</list>
</property>
</bean>
<bean id="log4jLoader" class="my.loader.Log4jLoader">
<property name="log4jCongif" value="${log4j.configuration}" />
</bean>
如您所见,propertiesToBeTaken
是 class 的一个实例org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
。
在第二种情况下,log4jLoader
是类的一个实例my.loader.Log4jLoader
,其中log4j.configuration
键的值被分配给 Log4jLoader 类的实例变量log4jCongif
。
我的问题如下:
- 类中没有
locations
变量PropertyPlaceholderConfigurer
,那么locations
这里是什么,又是从哪里来的呢?我如何与locations
类的实例相关联propertiesToBeTaken
? - 如果让我们说,
application.properties
键值对被加载到内存中,那么谁或我的意思是哪个方法加载它?application.properties
即使它被加载,那么这些文件的键值对如何被Log4jLoader
实例变量访问......? - 最后但我认为这可能是一个非常愚蠢的问题,在类
log4jLoader
类中,有一个setLog4jConfig(String log4jpropertiesLocation)
,但我真的看不出是谁在调用这个方法。在这里纠正我,这不是真的,在春天,我们创建的任何对象的 bean 都会自动调用类的实例方法。对 ?我需要在代码中进行更多搜索。正确的 ?
请在这里阐明我的疑问。在 spring 文档和在线上阅读了很多关于此的内容,但无法理解。真的很想了解它是如何发生的。
谢谢
解决方案
回答您的问题:
locations
在 bean config XML 中是指设置要加载的属性文件的位置的类的setLocations
方法。是多级继承中的父类。见官方文件PropertiesLoaderSupport
PropertiesLoaderSupport
PropertyPlaceholderConfigurer
- 当
PropertyPlaceholderConfigurer
被 Spring IoC 实例化时,这些属性在 bean 中设置,现在配置 XML 中的任何其他 bean 使用 请求属性值${key.name}
,spring 从具有此键值的 bean 中注入值。在您的情况下Log4jLoader
,${log4j.configuration}
它的值将被注入PropertyPlaceholderConfigurer
或者它是任何父类。 setLog4jConfig
当 spring 必须为类的属性之一赋值时,它会调用此方法Log4jLoader
。在您的情况下,由于<property name="log4jCongif" value="${log4j.configuration}" />
配置,spring 将调用属性的 setter 方法log4jCongif
来注入值。是的,spring 可以根据配置调用实例方法(特别是 setter)。
推荐阅读
- javascript - 更改拖放插件的布局设计
- python - Scrapy crawl 不遵循蜘蛛名称
- ios - 如何修改自定义 ButtonStyle 动画
- android - 如何区分 OnRestoreInstanceState 的路径?
- python-3.x - 使用 xarray 将多个 netcdf4 文件打开到单个数组中
- php - PHP中的循环内部函数
- javascript - Twit Get Tweet 被截断
- rust - 无法使用完全限定的语法来装箱未大小的类型
- python - 在 C++ 中创建数据包嗅探器
- laravel - 将整数时间戳保存到 laravel 中的时间戳字段