慢慢來比較快,虛心學技術
前言:創建應用對象之間協作關係的行爲通常稱爲裝配( wiring ),這也是依賴注入( DI )的本質
Spring提供三種Bean裝配機制:
- 在 XML 中進行顯式配置。
- 在 Java 中進行顯式配置
- 隱式的 bean 發現機制和自動裝配
在典型的 Spring 應用中,我們可能會同時使用自動化和顯式配置,幸好在 Spring 中,這些配置方案都不是互斥的
Ⅰ、在 JavaConfig 中引用 XML 配置
①將所有的bean放到一個config中配置顯得十分臃腫,可以將其中的類拆分開來進行獨立配置,然後使用@Import在總配置類中引入目標配置類進行統一配置
public class CDConfig {
@Bean
public CDBean cdBean(){
return new CDBean();
}
@Bean
public CDPlayer cdPlayer(){
return new CDPlayerImpl(cdBean());
}
}
如將上述的CDConfig拆分成兩個,同時創建統一配置類將兩個配置類引入,實現依賴注入(因爲拆分後,cdBean不存在於CDPlayerConfig中,故改用直接注入方式)
@Configuration//標明CDBean配置
public class CDBeanConfig {
@Bean
public CDBean cdBean(){
return new CDBean();
}
}
@Configuration//標明CDPlayer配置
public class CDPlayerConfig {
//此處的cdBean必須與CDBeanConfig中配置的方法cdBean同名或與@Bean指定的id同名,否則注入失敗
@Bean
public CDPlayer cdPlayer(CDBean cdBean){
return new CDPlayerImpl(cdBean);
}
}
@Configuration//標明全局配置
@Import(value = {CDBeanConfig.class,CDPlayerConfig.class})
public class SystemConfig {
}
②有時候我們需要使用JavaConfig和XML混合的方式去裝配Bean,那麼我們就需要使用@ImportResource將xml文件引入JavaConfig
如上述xml配置將CDBean配置於xml,而CDPlayer配置在JAVAConfig
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--裝配CDBean-->
<bean name="cdBean" class="com.my.spring.bean.CDBean">
<property name="title" value="The World!!"/>
<property name="author" value="Mr.D"/>
</bean>
</beans>
@Configuration//標明CDPlayer配置
public class CDPlayerConfig {
@Bean
public CDPlayer cdPlayer(CDBean cdBean){
return new CDPlayerImpl(cdBean);
}
}
@Configuration//標明全局配置
@Import(value = {CDPlayerConfig.class})
@ImportResource(locations = {"classpath:application.xml"})
public class SystemConfig {}
Ⅱ、在 XML 配置中引用 JavaConfig
①當xml中配置裝配的Bean越來越多的時候,一樣會遇到上述臃腫難以維護的問題,所以就需要將XML文件進行拆分管理,同時創建統一配置,方便管理。
如將上述XML配置中的CDBean和CDPlayer配置拆分成兩個XML文件,同時創建統一配置文件使用<import>節點引入兩個配置
CDBean的配置:CDBeanConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--定義一個名爲cdBean的Bean-->
<bean name="cdBean" class="com.my.spring.bean.CDBean">
<!--默認值注入-->
<property name="title" value="The World!!"/>
<property name="author" value="Mr.D"/>
</bean>
</beans>
CDPlayer的配置:CDPlayerConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--定義一個名爲cdBean的Bean-->
<bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
<!--將上面配置的cdBean類通過ref屬性注入到cdPlayer構造方法中名爲cdBean的參數中-->
<constructor-arg name = "cdBean" ref = "cdBean"/>
</bean>
</beans>
統一全局配置:SystemConfig.xml(與另外兩個文件同目錄)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource = "CDBeanConfig.xml" />
<import resource = "CDPlayerConfig.xml" />
</beans>
②如果意識到XML文件的裝配配置過於複雜,想要逐漸過渡到JavaConfig的配置,我們可以實現將JavaConfig中的配置引入XML文件統一管理
我們保持CDBean使用XML進行配置,同時使用上述CDPlayerConfig的JavaConfig裝配配置,使用SystemConfig.xml將兩者統一配置(但是由於CDPlayerConfig並不是XML配置文件,所以無法通過<import>節點引入,但是我們可以通過<bean>節點裝配實現)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource = "CDBeanConfig.xml" />
<bean class = "com.xxx.CDPlayerConfig" />
</beans>