在Spring 3中将PropertyOverrideConfigurer与带注释的类一起使用


问题内容

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

在我的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

我可以在这里做我想做的事吗?spring3是否有新的首选方式?


问题答案:

PropertyOverrideConfigurer使用你的属性文件作为bean
name.bean性质的关键。当@Component自动扫描您的配置时,Spring会将bean命名为不合格的类名(以小写字母开头)。在您的情况下,OrderService应将Bean命名为orderService。因此,以下方法应该起作用。

orderService.testMode=true

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

希望这可以帮助