在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中,这些都不是新功能。
希望这可以帮助