《Spring實戰》-第二章:Bean的裝配(4)-混合導入裝配機制

慢慢來比較快,虛心學技術

前言:創建應用對象之間協作關係的行爲通常稱爲裝配( wiring ),這也是依賴注入( DI )的本質

Spring提供三種Bean裝配機制:

  1. 在 XML 中進行顯式配置。
  2. 在 Java 中進行顯式配置
  3. 隱式的 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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章