Java Spring如何在内存中加载属性文件?

Java Spring如何在内存中加载属性文件?,java,spring,Java,Spring,我对春天真的很陌生,所以请不要生气,暂时忍受我 我试图理解application.properties或任何其他外部配置文件值是如何与提到配置文件的键(value=“${log4j.configuration}”)从文件本身使用其值的位置相关联的 例如,下面是spring bean xml文件: <bean id = "propertiesToBeTaken" class="org.springframework.beans.factory.config.PropertyPlace

我对春天真的很陌生,所以请不要生气,暂时忍受我

我试图理解
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> 

classpath*:application.properties
classpath*:*keys.properties
如您所见,
propertiesToBeTaken
是类
org.springframework.beans.factory.config.propertyplaceholderconfigure
的一个实例

在第二种情况下,
log4jLoader
是类
my.loader.log4jLoader
的实例,其中
log4j.configuration
键的值被分配给log4jLoader类的实例变量
log4jCongif

我的问题如下:

  • 属性PlaceHolderConfigure
    中没有
    位置
    变量,那么
    位置
    在这里和它的来源是什么?如何将
    位置
    与类的实例
    propertiesToBeTaken
    关联
  • 如果让我们说,
    application.properties
    键值对被加载到内存中,那么谁或我指的是哪个方法加载它?即使它被加载,那么
    application.properties
    文件的键值对是如何被
    Log4jLoader
    的实例变量访问的呢
  • 最后,但我认为这可能是一个非常愚蠢的问题,在类
    log4jLoader
    中,有一个
    setLog4jConfig(String log4jpropertiesLocation)
    ,但我真的看不出是谁在调用这个方法。请在这里纠正我,这不是真的,在spring中,我们创建的对象bean会自动调用类的实例方法。正确的?我需要搜索更多的代码。对吗
  • 请解释一下我的疑问。在spring文档和在线上阅读了很多关于这方面的内容,但无法理解。我真的很想知道这是怎么发生的


    谢谢

    回答您的问题:

  • bean config XML中的
    locations
    是指
    PropertiesLoaderSupport
    类的
    setLocations
    方法,该类设置要加载的属性文件的位置
    PropertiesLoaderSupport
    是多级继承中PropertyPlaceHolderConfigure的父类。看
  • 当Spring IoC实例化
    PropertyPlaceHolderConfigure
    时,这些属性在bean中设置,现在配置XML中的任何其他bean都使用
    ${key.name}
    请求属性值,Spring从具有该键值的bean中注入值。在您的情况下,
    Log4jLoader
    需要
    ${log4j.configuration}
    ,因此它的值将由
    PropertyPlaceHolderConfiguraer
    或它的任何父类注入
  • setLog4jConfig
    spring在必须为类
    Log4jLoader
    的属性之一赋值时调用此方法。在您的情况下,由于
    配置,spring将调用属性
    log4jCongif
    的setter方法来注入值Yesspring可以根据配置调用实例方法(特别是setter)

  • 回答你的问题:

  • bean config XML中的
    locations
    是指
    PropertiesLoaderSupport
    类的
    setLocations
    方法,该类设置要加载的属性文件的位置
    PropertiesLoaderSupport
    是多级继承中PropertyPlaceHolderConfigure的父类。看
  • 当Spring IoC实例化
    PropertyPlaceHolderConfigure
    时,这些属性在bean中设置,现在配置XML中的任何其他bean都使用
    ${key.name}
    请求属性值,Spring从具有该键值的bean中注入值。在您的情况下,
    Log4jLoader
    需要
    ${log4j.configuration}
    ,因此它的值将由
    PropertyPlaceHolderConfiguraer
    或它的任何父类注入
  • setLog4jConfig
    spring在必须为类
    Log4jLoader
    的属性之一赋值时调用此方法。在您的情况下,由于
    配置,spring将调用属性
    log4jCongif
    的setter方法来注入值Yesspring可以根据配置调用实例方法(特别是setter)

  • @莱尼:这是否澄清了你的疑虑?是的,我现在得到了东西。。。!但是告诉我一件事,你怎么知道地点指的是集合地点?其次,每当我们使用spring框架时,应该首先实例化与spring相关的代码或配置,因为它们的值被进一步注入要使用的代码中。。。?我的意思是什么是流量,谁来管理这个流量?Spring本身就是一个核心java。。!太多的问题,对于大多数问题,答案是Spring的IoC容器做了这些事情。如果你认为自己对所问问题的怀疑是明确的,那么你可以接受答案,这样也可以帮助其他人。@Lenny这能澄清你的怀疑吗?是的,我现在明白了。。。!但是告诉我一件事,你怎么知道地点指的是集合地点?其次,每当我们使用spring框架时,应该首先实例化与spring相关的代码或配置,因为它们的值被进一步注入要使用的代码中。。。?我的意思是什么是流量,谁来管理这个流量?Spring本身就是一个核心java。。!太多的问题,对于大多数问题,答案是Spring的IoC容器做了这些事情。如果你认为你的怀疑很清楚