簡化Spring XML配置---使用註解裝配

註解裝配(注入)是spring在2.5版本引入的新特性,使用註解裝配和在XML文件中使用autowire屬性自動裝配類似,只是使用註解方式允許更細粒度的裝配(更完善),我們可以對屬性有選擇性的進行自動裝配。在以往,我們對屬性進行注入的時候,需要在XML文件中進行如下配置:

    <!-- 屬性注入 -->
    <bean id="Duke" class="com.bean.Wife">
        <property name="age" value="25"></property>
    </bean>
    <!-- 構造器注入 -->
    <bean id="Duke" class="com.bean.Wife">
        <constructor-arg value="25" />
    </bean>

對於只含有少量Bean的應用來說,使用XML配置並不會顯得特別麻煩,但是對於一個含有大量Bean的應用來說,任然使用XML配置就顯得越來越複雜,基於減少XML配置的內容,spring出現了兩種減少XML配置的方式:

1:自動裝配(autowiring)讓spring自動識別如何裝配Bean的依賴關係

2:自動檢測(autodiscovery)比自動裝配更進一步,讓spring自動識別哪些類需要被自動裝配爲Bean

自動裝配有兩種方式,一種是在XML文件中使用autowire自動裝配,一種是使用註解的方式進行自動裝配,雖然兩者在裝配過程中並沒有太大差別,但是在平時的使用過程中,註解的方式用的更多,因爲相對於在XML中自動裝配來說,註解方式支持更細粒度的裝配,我們可以選擇性的標註某一個屬性來對應用自動裝配。那麼如何使用註解方式進行自動裝配呢?

在使用註解方式進行自動裝配之前,我們需要在XML配置文件中使用開啓它(注意使用context命名空間時需要在XML配置文件中進行聲明),spring支持三種方式的自動裝配:

1:spring自有的@Autowired

2:JSR-330的@Inject

3:JSR-250的@Resource

一:使用@Autowired
使用@Autowired註解對屬性進行裝配的時候,我們可以對屬性本身,屬性set方法或者構造器進行註解(需要注意的是此時我們的XML文件中對Bean的定義不能少,只是可以去掉或者),其註解代碼如下:

    @Autowired//對構造器進行註解
    public void setAge(int age){
        this.age = age;
    }
    @Autowired//對屬性進行註解,此時大可以刪掉get/set方法
    private int age;</span>
    @Autowired//對構造器進行註解
    public Wife(int age) {
        this.age = age;
    }

如上所示,當我們使用@Autowired進行註解的時候,spring會在XML文件中找到對用的Bean,然後對屬性進行注入,但是,我們在使用@Autowired的時候,需要注意兩點,一是沒有與註解匹配的Bean,二是存在多個與註解匹配的Bean,如果出現這兩種情況,就會拋出NoSuchBeanDefinitionException異常,如何解決這個問題呢?spring提供了通過設置@Autowired的required屬性爲false來設置自動裝配可選(也就是說遇到沒有與註解匹配的Bean這種狀況,被注入屬性的值會被設置爲null),required屬性可以用於@Autowired註解的任何地方,但是當使用構造器進行注入的時候,智能有一個構造器可以設置required爲true,其他構造器只能設置required爲false。

    @Autowired(required=false)//對構造器進行註解
    public Wife(int age) {
        this.age = age;
    }

另外一種情況是,當存在多個Bean滿足裝配條件,spring該做何處理呢?在這裏,我們可以使用@Qualifier註解來幫助@Autowired限定哪一個Bean纔是所需的

@Autowired
    @Qualifier("wife")
    private Wife wife ;

在上訴代碼中,@Qualifier將注入ID爲wife的Bean,在這裏可以理解爲@Qualifier將@Autowired的byType自動裝配顯示的轉化爲了byName裝配。

二:使用@Inject
@Inject註解方式和@Autowired註解方式基本相同,使用@Autowired註解的地方同樣可以換成@Inject,@Inject也可以對屬性,set方法或者構造器進行註解,但是@Inject沒有required屬性,因此,被@Inject註解的依賴關係必須存在,如果不存在,則會拋出異常,@Inject對於處理存在多個Bean的情況使用的是@Named屬性進行限定的,代碼如下:

    @Autowired
    @Named("wife")
    private Wife wife ;

@Resource在使用上依然類似於@Autowired註解,只不過@Resource默認以名稱進行匹配,@Resource有兩個重要的屬性,name和type,當沒有指定@Resource的name或者type屬性時,@Resource默認以名稱進行匹配,如果沒有匹配到,則以類型進行匹配,但是一旦設置@Resource的name屬性,那麼@Resource則只能以名稱進行匹配。

在使用以上三種註解方式的時候,需要在XML文件中配置以下信息,該配置隱式註冊了多個註釋進行解析處理的處理器,AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanProcessor,RequiredAnnotationBeanPostProcessor。如果沒有註冊解析處理器,但是又在使用的話,則會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章