首页 > 解决方案 > 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

我的问题如下:

  1. 类中没有locations变量PropertyPlaceholderConfigurer,那么locations这里是什么,又是从哪里来的呢?我如何与locations类的实例相关联propertiesToBeTaken
  2. 如果让我们说,application.properties键值对被加载到内存中,那么谁或我的意思是哪个方法加载它?application.properties即使它被加载,那么这些文件的键值对如何被Log4jLoader实例变量访问......?
  3. 最后但我认为这可能是一个非常愚蠢的问题,在类log4jLoader类中,有一个setLog4jConfig(String log4jpropertiesLocation),但我真的看不出是谁在调用这个方法。在这里纠正我,这不是真的,在春天,我们创建的任何对象的 bean 都会自动调用类的实例方法。对 ?我需要在代码中进行更多搜索。正确的 ?

请在这里阐明我的疑问。在 spring 文档和在线上阅读了很多关于此的内容,但无法理解。真的很想了解它是如何发生的。

谢谢

标签: javaspring

解决方案


回答您的问题:

  1. locations在 bean config XML 中是指设置要加载的属性文件的位置的类的setLocations方法。是多级继承中的父类。见官方文件PropertiesLoaderSupportPropertiesLoaderSupportPropertyPlaceholderConfigurer
  2. PropertyPlaceholderConfigurer被 Spring IoC 实例化时,这些属性在 bean 中设置,现在配置 XML 中的任何其他 bean 使用 请求属性值${key.name},spring 从具有此键值的 bean 中注入值。在您的情况下Log4jLoader${log4j.configuration}它的值将被注入PropertyPlaceholderConfigurer或者它是任何父类。
  3. setLog4jConfig当 spring 必须为类的属性之一赋值时,它会调用此方法Log4jLoader。在您的情况下,由于<property name="log4jCongif" value="${log4j.configuration}" />配置,spring 将调用属性的 setter 方法log4jCongif来注入值。的,spring 可以根据配置调用实例方法(特别是 setter)。

推荐阅读