如何通过 ApplicationContext 访问属性

Posted

技术标签:

【中文标题】如何通过 ApplicationContext 访问属性【英文标题】:How do I access a property via the ApplicationContext 【发布时间】:2011-10-19 14:42:49 【问题描述】:

在 Spring ApplicationContext 中使用属性文件时,可以通过以下方式访问其属性:在您的 xml 配置文件中使用 $someproperty。但是如何在不通过 xml 注入的情况下访问 java 代码中的相同属性?

ApplicationContext 配置

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="myapp.properties" />
    </bean>
    <bean class="my.app.MyClass">
        <property name="foo" value="$someproperty" />
    </bean>
</beans>

属性

someproperty=somevalue

更新 1 实际的一点是,在属性文件中设置了应用程序的唯一 ID(例如由系统管理员编辑)的特殊情况。一些应用程序类实现了 ApplicationContextAware,因此它们可以访问上下文并防止在每个类中注入或为我们想要一个 ez 属性访问方法的每个类定义一个 bean。在这种情况下,我们的应用程序“了解”Spring 不是问题。

【问题讨论】:

你能解释一下“防止在每个类中注入或为每个类定义一个bean”吗? 如果我们不使用注释,每个需要访问属性本身的 bean 都需要一个“属性”标签。它只是将工作从类移动到 xml。 我实际上倾向于使用类似这篇博文中的配置类:chrislovecnm.com/2010/03/08/… 【参考方案1】:

访问属性没有任何意义,它违背了 IoC 原则,即 Spring 的主要目标。除了其他答案之外,您可能需要所有属性吗?在这种情况下,有一个 PropertiesFactoryBean 对象可以让您 Properties 对象访问所有属性。

PropertyPlaceholderConfigurer bean 旨在替换 spring 上下文中的占位符。至少任何其他用法都会令人困惑。

【讨论】:

【参考方案2】:

良好的风格让您的代码尽可能少地了解 Spring,但您可以通过 @Value 注释(假设您使用 Spring 3)将其注入属性或构造函数(取决于您如何构建你的豆子)。否则,您可以从 webapp 的配置中选择它,但根据我的经验,这更容易出错。 (使用 Spring 执行此操作的另一个好处是,它可以轻松地将来自多个不同来源的属性与复杂的覆盖规则合并。手动执行此操作很痛苦。)

【讨论】:

这看起来很有希望,是的,我们正在使用 Spring 3【参考方案3】:

我会获取placeHolderConfig bean(例如,从 applicationContext 或通过注入它),PropertyPlaceholderConfigurer 有一个访问方法,请看这里:

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/beans/factory/config/PropertyResourceConfigurer.html#convertPropertyValue(java.lang.String)

【讨论】:

这不是“访问方法”。这是一种内部方法,具有受保护的扩展可见性——绝对不能以这种方式使用。

以上是关于如何通过 ApplicationContext 访问属性的主要内容,如果未能解决你的问题,请参考以下文章

Spring DI applicationContext.xml xsi:schemaLocation 究竟是如何使用的?

如何以编程方式在 Spring ApplicationContext 中启用“annotation-config”

Dagger 2 Activity 上下文/ApplicationContext 模块

markdown 通过ApplicationContext中获取豆

ApplicationContext 如何关闭或释放?

ApplicationContextAware得到ApplicationContext的原理