2012-04-05 262 views
4

編輯使用PropertyOverrideConfigurer與註解的類:這是爲什麼公認的答案對我的作品一些解釋,可能這可能是其他人的麻煩。在春季3

在我的富-APP-servlet.xml中,我有這樣一行:

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

當我之前使用spring2,我所有的服務組件從applicationContext.xml中來了,但現在他們直接被帶到在foo-app-servlet.xml中。在我的項目上,servlet有自己的覆蓋集合,所以我需要覆蓋servlet覆蓋文件而不是applicationContext覆蓋文件。

覆蓋時,如果你還沒有命名您的組件,然後它確實用它的小寫版本,所以覆蓋OrderService.foo,你這樣做:

orderService.foo=bar 

末編輯

我正在從一個項目,從春季2.5升級到春季3,因此有xml和基於註釋的配置。我們以前使用PropertyOverrideConfigurer在不同環境中更改屬性以取得巨大成功。我現在正在研究使用authorize.net的代碼,我需要確保我不會從開發環境向他們發送任何內容。

爲了做到這一點,我想重寫與PropertyOverrideConfigurer我的「測試模式」屬性。這對於通過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; 
    } 

} 

我已經試過了沒幾件事」 t工作:

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

是否有可能做我想在這裏做的事情?春天3有一個新的首選方式嗎?

回答

5

PropertyOverrideConfigurer使用在你的屬性密鑰文件作爲bean name.bean財產。當@Component自動掃描您的配置時,Spring會將該bean命名爲以小寫字母開頭的非限定類名。在你的情況下,OrderService bean應該被命名爲orderService。所以,以下應該工作。

orderService.testMode=true 

您也可以通過傳遞一個名稱組件註釋像@Component("OrderService")@Component("com.foo.services.OrderService")命名豆。這些在Spring 3.x中都不是新的。

希望這有助於

+0

我相信,我嘗試這樣做,得到了一個錯誤,因爲它試圖組件掃描發生之前覆蓋屬性。我很快就會再來一次,讓你知道。我認爲我已經嘗試過這個的原因是,它實際上是我嘗試的第一件事。但是我沒有像上面那樣命名組件。 – samspot 2012-04-24 20:05:43

+0

不要這樣做。我指定一個名字: @Component( 「orderService」) 公共類OrderService {... 並確定這些在我的屬性文件: orderService.authorizenetProperties = 「富」; orderService.var =「bar」; 沒有錯誤,但是在訪問該類時未設置屬性。 – samspot 2012-04-26 16:58:52

+0

好的......我想出了這裏發生了什麼。 Web應用程序servlet xml具有。正因爲如此,它本身並不通過applicationContext.xml來拉取我的依賴關係。所以我需要使用servlet的覆蓋文件,而不是applicationContext。謝謝你的明確答案,如果沒有它,我不會發現它! – samspot 2012-04-26 17:07:41

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。

我還是想知道「正確」的方式做到這一點,如果有人知道。

謝謝!