在Spring 3中使用带有注释类的PropertyOverrideConfigurer

时间:2012-04-05 19:23:20

标签: java spring spring-mvc

编辑:这里有一些解释为什么接受的答案对我有用,可能对其他人有什么问题。

在我的foo-app-servlet.xml中,我有这一行:

<context:component-scan base-package="com.foo.app" />

当我之前使用spring2时,我的所有服务bean都来自applicationContext.xml,但现在它们直接被引入foo-app-servlet.xml。在我的项目中,servlet有自己的一组覆盖,所以我需要覆盖servlet覆盖文件而不是applicationContext覆盖文件。

覆盖时,如果你没有命名你的组件,那么它确实使用它的小写版本,所以要覆盖OrderService.foo,你这样做:

orderService.foo=bar

结束修改

我正在开发一个从spring 2.5升级到spring 3的项目,因此同时具有xml和基于注释的配置。我们以前使用PropertyOverrideConfigurer来更改不同环境中的属性,以取得巨大成功。我现在正在研究使用authorize.net的代码,我需要确保不从开发环境向他们发送任何内容。

为了实现这一点,我想用PropertyOverrideConfigurer覆盖我的'testMode'属性。这适用于通过xml配置的bean,但我无法弄清楚如何使用注释配置的类来完成它。

这是我在applicationContext.xml中的覆盖片段:

<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
    <property name="location" value="file:${user.home}/override.properties" />
    <property name="localOverride" value="true" />
    <property name="ignoreResourceNotFound" value="true" />
</bean>

以下是具有我要覆盖的属性的类:

@Component
public class OrderService {
    private static Log logger = LogFactory.getLog(OrderService.class);

    @Autowired @Qualifier("OrderDAO") private OrderDAO orderDao;

    @Autowired private SiteManager siteManager;
    String authorizenetProperties = "classpath:authorizenet.properties";

    private Boolean testMode = false;

    public Boolean getTestMode() {
        return testMode;
    }

    public void setTestMode(Boolean testMode) {
        this.testMode = testMode;
    }

}

我尝试过一些不起作用的事情:

com.foo.services.OrderService.testMode=true
OrderService.testMode=true

我可以在这里做我想做的事吗?春季3有一种新的首选方式吗?

2 个答案:

答案 0 :(得分:5)

PropertyOverrideConfigurer使用属性文件中的键作为bean name.bean属性。当@Component自动扫描您的配置时,Spring会将bean命名为以小写字母开头的非限定类名。在您的情况下,OrderService bean应命名为orderService。因此,以下内容应该有效。

orderService.testMode=true

您还可以通过将名称传递给组件注释(如@Component("OrderService")@Component("com.foo.services.OrderService"))来命名Bean。这些都不是Spring 3.x中的新功能。

希望这有帮助

答案 1 :(得分:0)

发布此非最佳解决方案:

您可以使用另一个bean解决此问题:

的applicationContext.xml:

    <bean id="SiteProperties" class="com.foo.utilities.SiteProperties">
        <property name="serviceUrl" value="http://localhost:8080" />
        <property name="authorizationTestMode" value="false" />
    </bean>

OrderService.java:

@Component
public class OrderService {
    private static Log logger = LogFactory.getLog(OrderService.class);

    @Autowired @Qualifier("OrderDAO") private OrderDAO orderDao;

    @Autowired private SiteManager siteManager;
    @Autowired private SiteProperties siteProperties;
    String authorizenetProperties = "classpath:authorizenet.properties";
}

所以只需创建一个xml配置的bean并注入注释配置的bean。

如果有人知道,我仍然想知道“正确”的做法。

谢谢!