1. 程式人生 > >Bean裝配方式詳解

Bean裝配方式詳解

spring裝配bean的三種方式:

  • 在XML中進行顯示裝配
  • 在XML中進行顯示裝配在Java中進行顯示裝配
  • 在XML中進行顯示裝配隱式的Bean發現和裝配機制

一、自動化裝配Bean

Spring從兩個角度實現自動化裝配:

  1. 元件掃描(ComponentScan)):spring會自動發現spring應用上下文中所建立的Bean
  2. 自動裝配(Autowried):Spring自動滿足Bean之間的依賴

第一方面:從元件掃描的角度

  • Spring會自動發現應用上下文所建立的bean
    建立介面:
public interface CompactDisc{
    void play();
}

建立類:

@Component
public class SgtPeppers implements CompactDisc{
public void play(){ Ststem.out.println("Hello world!"); } }

解釋:@Component這個註解表示該類會作為元件類,並告知Spring要為這個類建立bean,但是元件掃描預設是不開啟的,我們需要顯示的配置一下Spring
建立配置類:

@ComponentScan
@Configuration
public class CDPlayerConfig{
}

解釋:@ComponentScan會在Spring啟用元件掃描,預設掃描與配置類相同的包,可以設定掃描的包,查詢帶有@Component註解的類
@Configuration表明這是一個配置類
通過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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 
       
       <context:component-scan base-package="com" /
</beans>

注意:如果你的應用程式中,所有的物件都是獨立的,彼此之間沒有任何依賴,那麼使用元件掃描就可以,但是很多物件會依賴其他的物件完成任務,這樣我們就需要一種方法將元件掃描的到的bean和他們的依賴裝配在一起,所以要了解一下自動裝配

第二方面:從自動裝配方面

通過為bean添加註解實現自動裝配,我們可以藉助@Autowried註解

通過自動裝配,將一個CompactDisc注入到CDPlayer中

@Component
public class CDPlayer implements MediaPlayer{
    private CompactDisc cd;
    @Autowried
    public CDPlayer(CompactDisc cd){
        this.cd = cd;
    }
    public void play(){
        cd.play();
    }   
}

@Autowried不僅可以用在構造器上,還可以用在屬性的setter方法上,比如CDPlayer有一個setCompactDisc方法,可以採用如下的形式實現自動化裝配

@Autowried
public  void setCompactDisc(CompactDisc cd){
    this.cd = cd;
}

解釋:在Spring初始化bean後,他會盡可能去滿足bean的依賴,在本例中,依賴是通過帶有@Autowried註解的方法宣告的。
不管是構造器,Setter方法還是其他的方法,Spring都會嘗試滿足方法引數上所宣告的依賴,假如只有一個bean匹配依賴的話,那麼這個bean就會被匹配進來
如果沒有匹配的bean,那麼在應用上下文建立的時候,Spring會丟擲一個異常,為了避免這種異常,可以將@Autowried的required屬性值設定為false

二、使用java顯示建立Bean

儘管在很多情況下使用元件掃描和自動裝配實現Spring的自動化配置是更為推薦的方式,但是有時候這種方案行不通,因此需要明確配置Spring,比如將第三方外掛裝配到你的應用中去,是沒有辦法在他的類上新增@Component和@Autowired註解的,因此必須採用顯示裝配的方法。

在顯示裝配的時候,javaConfig是更好的方案,因為它更為強大,型別安全,並且對重構友好。通常將JavaConfig程式碼放在單獨的包中,使它與其他應用程式邏輯分離開來。

第一步:建立配置類
建立配置類的關鍵在於為其新增@Configuration註解,此註解表明這個類是一個配置類,該類包含在spring應用上下文中如何建立bean的細節.

@Configuration
public class CDPlayConfig{
}

第二步:宣告簡單的bean
@Bean註解會告訴Spring這個方法會返回一個物件,該物件要註冊為Spring應用上下文中的Bean.
預設情況下Bean的ID與帶@Bean註解的方法名是一樣的,也可以通過name屬性指定一個名字

下面的程式碼返回了所需型別的例項,聲明瞭CompactDisc bean:

@Configuration
public class CDPlayConfig{
    //Bean(name="123")
    //SgtPeppers繼承CompactDisc介面
    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();//返回此類的一個例項
    }
}

第三步:藉助javaConfig實現依賴注入
將CompactDisc bean 注入到CDPlayer bean中

構造器注入:

@Configuration
public class CDPlayConfig{
    //Bean(name="123")
    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();//返回此類的一個例項
    }
    @Bean 
    public CDPlayer cdPlayer(){
        return new CDPlayer(sgtPeppsers());
    }
    //或者使用下面這種方法:
    /*
    當Spring呼叫cdPalyer() 建立CDPlayer bean的時候,他會自動裝配一個CompactDisc到配置方法中
    public CDPlayer cdPlayer(CompactDisc compactDisc){
        return new CDPlayer(compactDisc);
    }
    */
}

Setter方法注入

@Configuration
public class CDPlayConfig{
    @bean 
    public CDplayer cdPlayer(CompactDisc compactDisc){
        CDPlayer cdPlayer = new CDPlayer(compactDisc);
        cdPlayer.setCompactDisc(compactDisc);
        return cdPlayer;
    }
}

三、使用XML顯示配置Bean

spring最初,XML是最主要的配置方式,在XML中建立Bean需要使用<bean>元素

<?xml version="1.0" encoding="GBK"?>  
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns="http://www.springframework.org/schema/beans"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">  
    <!--配置bean-->
    <bean class="com.Hello"/>

這是最簡單的XML方式的Bean宣告,僅僅指定了該Bean屬於的類,Bean的命名規則為全限定類名來命名,該Bean的名稱為“com.Hello#0”,其中“#0”是一個計數,從0開始
也可以使用id屬性來命名

<bean id="hello" class="com.Hello"/>

一般我們對需要引用的Bean指定名稱,對不需要引用的,採用自動命名即可
採用XML配置Bean的缺點:在這個簡單的Bean宣告中,我們將Bean的型別以字串的形式設定在了class屬性中,但是不能保證class屬性的值是真正的型別。

藉助構造器注入初始化Bean

1. 元素:附加檔案:https://blog.csdn.net/qq_41357573/article/details/84445743
2.使用spring3.0所應用的c:名稱空間 在使用之前,必須在頂部宣告其模式
xmlns:c="http://www.springframework.org/schema/c"
......

<bean id="hello" class="com.Hello" c:cd-ref="test">
<!--test為一個bean引用,而不是字面量-->
<!--只有一個構造器引數的時候,可以不使用表示引數-->
<bean id="hello" class="com.Hello" c:_-ref="test">

將字面量注入到構造器中

使用c:名稱空間

<bean id="hello" class="com.Hello" c:cd-ref="test"
    c:_name="yq"
    c:_age=""23/>
<!--也可以使用下面這種方式,通過引數索引裝配相同字面量-->
<bean id="hello" class="com.Hello" c:cd-ref="test"
    c:_0="yq"
    c:_1=""23/>
<!--如果只有一個構造器引數的話-->
<bean id="hello" class="com.Hello" c:cd-ref="test"
    c:_="yq"/>

裝配集合

類:

......
//包含值
public people(String name;string age;List<String>kills){
    this.name = name;
    this.age = age;
    thsi.kills = kills;
} 

XML配置:

<!--首先使用List將其宣告為一個列表-->
<bean id="people" class="類路徑" 
    <constructor-arg value="yq"/>
    <constructor-arg value="23"/>
    <constructor-arg>
        <list>
            <value>1</value>
            <value>2</value>
            <value>3</value>
        </list>
    </constructor-arg>
</bean>

實現bean引用列表的裝配:

<bean id="people" class="類路徑" 
    <constructor-arg value="yq"/>
    <constructor-arg value="23"/>
    <constructor-arg>
        <list>
            <ref bean="a"/>
            <ref bean="b"/>
            <ref bean="c"/>
        </list>
    </constructor-arg>
</bean>
總結: 上述三種裝配技術非常有用,但是在便利性方面,最強大的還是Spring的自動化裝配置,自動化裝配分為兩個方面,一個方面是當所有的物件之間沒有依賴時,所需要的僅是元件掃描而已,元件掃描分為java配置和XMl配置。另一方面,當物件會依賴其他物件才能完成任務時,這時就需要自動裝配。