4

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

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

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

之前用spring2的时候,我所有的service beans都来自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

可以在这里做我想做的事吗?spring 3 有新的首选方式吗?

4

2 回答 2

5

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

orderService.testMode=true

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

希望这可以帮助

于 2012-04-24T19:02:42.507 回答
0

发布此非最佳解决方案:

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

应用程序上下文.xml:

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

订单服务.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 注入您。

如果有人知道,我仍然想知道执行此操作的“正确”方法。

谢谢!

于 2012-04-05T19:50:22.597 回答