我們可以爲XML中提及的同一個bean id重複名稱嗎? 如果不是,那麼我們如何重寫Spring中的bean?Spring的覆蓋bean
回答
任何給定的Spring上下文對於任何給定的id或名稱只能有一個bean。在XML id
屬性的情況下,這由模式驗證強制執行。在name
屬性的情況下,這是由Spring的邏輯強制執行的。
但是,如果上下文是由兩個不同的XML描述符文件構成的,並且兩個文件都使用了id
,則會「覆蓋」另一個文件。確切的行爲取決於文件在被上下文加載時的排序。
所以雖然有可能,但並不推薦。這很容易出錯並且很脆弱,如果你改變了一個而不是另一個的ID,你將不會從Spring那裏得到任何幫助。
如果它們處於相同的層次結構中有風險,但可以使用'profiles'(請參閱我的回答)更好地控制它。 – 2015-05-07 11:42:25
有沒有辦法指示Spring在遇到任何具有相同ID的bean(即強調不允許覆蓋)時拋出錯誤?這是用於'ServletContextHandler'的'contextConfigLocation'屬性。 – 2015-08-28 20:22:30
從official spring manual一個例子:
<bean id="inheritedTestBean" abstract="true"
class="org.springframework.beans.TestBean">
<property name="name" value="parent"/>
<property name="age" value="1"/>
</bean>
<bean id="inheritsWithDifferentClass"
class="org.springframework.beans.DerivedTestBean"
parent="inheritedTestBean" init-method="initialize">
<property name="name" value="override"/>
<!-- the age property value of 1 will be inherited from parent -->
</bean>
是你在找什麼?
看起來像官方的春季手冊鏈接已損壞。 – Buchi 2012-02-01 10:11:50
@Buchi感謝您的提示,修復了鏈接 – 2012-02-07 15:02:12
我們是否可以在其他xml中爲其他參考e.x聲明相同的bean id。
Servlet的Initialize.xml
<bean id="inheritedTestBean" class="org.springframework.beans.TestBean">
<property name="name" value="parent"/>
<property name="age" value="1"/>
</bean>
其它XML(document.xml中)
<bean id="inheritedTestBean" class="org.springframework.beans.Document">
<property name="name" value="document"/>
<property name="age" value="1"/>
</bean>
我會補充一點,如果你需要的只是覆蓋由您使用Bean的屬性,標識辦法也像skaffman解釋:
在你的第一個被調用的XML配置文件中:
<bean id="myBeanId" class="com.blabla">
<property name="myList" ref="myList"/>
</bean>
<util:list id="myList">
<value>3</value>
<value>4</value>
</util:list>
在你的第二個所謂的XML配置文件:
<util:list id="myList">
<value>6</value>
</util:list>
然後你豆「myBeanId」將是6
不知道一個元素的「myList中」屬性被實例化,如果這正是你需要什麼,但我們使用配置文件來定義我們是在和每個環境的具體豆運行的環境,所以它的類似的東西:
<bean name="myBean" class="myClass">
<constructor-arg name="name" value="originalValue" />
</bean>
<beans profile="DEV, default">
<!-- Specific DEV configurations, also default if no profile defined -->
<bean name="myBean" class="myClass">
<constructor-arg name="name" value="overrideValue" />
</bean>
</beans>
<beans profile="CI, UAT">
<!-- Specific CI/UAT configurations -->
</beans>
<beans profile="PROD">
<!-- Specific PROD configurations -->
</beans>
因此,在這種情況下,如果I D不定義配置文件,或者如果我將其定義爲「DEV」,則myBean將爲其名稱參數獲得「overrideValue」。但是,如果我將配置文件設置爲「CI」,「UAT」或「PROD」,它將獲得「originalValue」作爲值。
重寫bean的另一種方法是通過別名。這個blog article解釋了這種方法。
其他職位沒有提到的另一個好方法是使用PropertyOverrideConfigurer如果你只是想覆蓋性能一些豆類。
例如,如果您想覆蓋測試的數據源(即,使用內存數據庫)在另一個xml配置中,您只需在新配置中使用<context:property-override ..."/>
,並使用包含格式爲beanName.property=newvalue
的鍵值的.properties
文件覆蓋主要道具。
應用mainConfig.xml:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
p:driverClassName="org.postgresql.Driver"
p:url="jdbc:postgresql://localhost:5432/MyAppDB"
p:username="myusername"
p:password="mypassword"
destroy-method="close" />
應用testConfig.xml:
<import resource="classpath:path/to/file/application-mainConfig.xml"/>
<!-- override bean props -->
<context:property-override location="classpath:path/to/file/beanOverride.properties"/>
beanOverride.properties:
dataSource.driverClassName=org.h2.Driver
dataSource.url=jdbc:h2:mem:MyTestDB
- 1. 覆蓋jar文件中的spring bean
- 2. Spring框架和覆蓋默認bean
- 3. Spring XML bean定義測試覆蓋率
- 4. Spring java配置bean定義覆蓋
- 5. @Autowired覆蓋@Bean
- 6. Spring覆蓋RequestToViewNameTranslator
- 7. Spring @RequestBody覆蓋
- 8. Spring的AuthenticationProcessingFilter覆蓋
- 9. 春季覆蓋bean配置
- 10. 如何覆蓋基於Web服務器的Spring bean
- 11. Spring Boot:覆蓋favicon
- 12. 覆蓋ResourceHttpRequestHandler Spring MVC
- 13. Spring:在集成測試中用隔離覆蓋bean
- 14. 覆蓋Spring中的ExecutorSubscribableChannel?
- 15. 覆蓋Spring Roo中的EntityManager.remove()
- 16. 覆蓋Grails插件bean的方法
- 17. 如何覆蓋測試的範圍bean?
- 18. 覆蓋spring-data-cassandra SchemaAction
- 19. 通過@Import覆蓋Spring @PropertySource
- 20. 覆蓋Spring XML配置
- 21. Spring Data Neo4j覆蓋屬性
- 22. Java bean驗證 - 覆蓋默認消息
- 23. 使用PropertyOverrrideConfigurer覆蓋bean引用
- 24. Javaconfig bean覆蓋失敗,並注入List
- 25. 在集成測試中覆蓋bean
- 26. 是否可以部分注入或覆蓋spring bean的屬性(以mule)
- 27. 在Spring框架中覆蓋或覆蓋ActiveProfiles
- 28. 覆蓋覆蓋?
- 29. 如何覆蓋Spring的行爲@Autowired
- 30. 如何覆蓋spring的導入註釋
你能張貼一些示例xml以準確顯示你的意思 – 2011-05-01 15:20:22