Spring基本功能-依賴注入

1、Spring的依賴注入(DI)

  1.1 xml形式注入   java

  (1)普通變量的注入spring

//普通變量的注入,xml配置property,實體類配置set方法注入
<bean id="person" class="com.jyk.spring.simpletest.Person">
        <property name="id" value="1"></property>
        <property name="name" value="tom"></property>
</bean> public class Person { public String id; public String name; public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void printInfo(){ System.out.println("id=="+id); System.out.println("name=="+name); } }

  (2)對象的引用注入,該種形式的xml配置靈活,建議使用內部bean的配置形式函數

//多對象的引用注入,一樣可採用常規的xml配置,對象中配置set方法來實現注入
<bean id="dao" class="com.jyk.spring.simpletest.Dao"> </bean> <bean id="service" class="com.jyk.spring.simpletest.Service"> <property name="dao" ref="dao"></property> </bean> <bean id="action" class="com.jyk.spring.simpletest.Action"> <property name="service" ref="service"></property> </bean>

//內部bean的配置形式

  <bean id="action" class="com.jyk.spring.simpletest.Action">

    <property name="service">
      <bean class="com.jyk.spring.simpletest.Service">
        <property name="dao">
          <bean class="com.jyk.spring.simpletest.Dao"></bean>
        </property>
      </bean>
    </property>
  </bean>ui

public class Action {

    private Service service;
    
    public void setService(Service service) {
        this.service = service;
    }

    public void execute(){
        service.execute();
    }
}

public class Service {

    private Dao dao;
    
    public void setDao(Dao dao) {
        this.dao = dao;
    }

    public void execute(){
        dao.execute();
    }
}

public class Dao {

    public void execute(){
        System.out.println("dao執行邏輯");
    }
}

    (3)p 名稱空間給對象的屬性注入值(該功能僅Spring3.0以上支持)this

<bean id="person" class="com.jyk.spring.simpletest.Person" p:id="1" p:name="cat"></bean>
<bean id="dao" class="com.jyk.spring.simpletest.Dao"></bean>
    
<bean id="service" class="com.jyk.spring.simpletest.Service" p:dao-ref="dao"></bean>
    
<bean id="action" class="com.jyk.spring.simpletest.Action" p:service-ref="service"></bean>

    (4)裝配list,set,map,properties集合spa

 <bean id="person" class="com.jyk.spring.simpletest.Person">
    </bean>
        
    <bean id="person1" class="com.jyk.spring.simpletest.Person1">
        <property name="list">
            <list>
                <value>list1</value>
                <value>list2</value>
                <ref bean="person"/>
            </list>
        </property>
        <property name="set">
            <set>
                <value>set1</value>
                <value>set2</value> 
                <ref bean="person"/>        
            </set>
        </property>
        <property name="map">
            <map>
                  <entry key="key1">
                          <value>map1</value>
                  </entry>
                  <entry key="key2">
                          <value>map2</value>
                  </entry>    
             </map>          
        </property>
        <property name="properties">
           <props>
             <prop key="01">prop1</prop>
             <prop key="02">prop2</prop>
           </props>
        </property>        
    </bean>

public class Person1 {

    private List list;
    private Map map;
    private Set set;
    private Properties properties;
    public void setList(List list) {
        this.list = list;
    }
    public void setMap(Map map) {
        this.map = map;
    }
    public void setSet(Set set) {
        this.set = set;
    }
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
    
    public void printInfo(){
        System.out.println("list=="+list);
        System.out.println("map=="+map);
        System.out.println("set=="+set);
        System.out.println("properties=="+properties);
    }
}

   1.2 自動裝配code

     什麼是自動裝配?就是對屬性,方法參數,引用的其餘bean,無需經過property的形式來配置,而是經過必定的自動裝配策略,交由Spring進行自動適配和裝載。強烈建議使用自動裝配,由於擴展性高,代碼可維護性強,好比在java代碼中新增一個屬性或引用,只需添加set方法,以及配置文件中配置對應的bean便可。並且自動裝配也能夠顯著減小bean配置的繁瑣過程。xml

     (1)byName 根據屬性名自動裝配。此選項將檢查容器並根據名字查找與屬性徹底一致的bean,並將其與屬性自動裝配。對象

public class Action {

    private Service service;
    
    public void setService(Service service) {
        this.service = service;
    }

    public void execute(){
        service.execute();
    }
}

public class Service {

    private Dao dao;
    
    public void setDao(Dao dao) {
        this.dao = dao;
    }

    public void execute(){
        dao.execute();
    }
}

public class Dao {

    public void execute(){
        System.out.println("dao執行邏輯");
    }
}

    <bean id="dao" class="com.jyk.spring.simpletest.Dao"></bean>
    
    <bean id="service" class="com.jyk.spring.simpletest.Service" autowire="byName"></bean>
    
    <bean id="action" class="com.jyk.spring.simpletest.Action" autowire="byName"></bean>

    (2)byType 若是容器中存在一個與指定屬性類型相同的bean,那麼將與該屬性自動裝配。若是存在多個該類型的bean,那麼將會拋出異常,並指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean,則什麼事都不發生,屬性也不會被設置。如沒找到匹配的bean須要拋出異常,則能夠經過設置經過設置 
                     dependency-check="objects"來使Spring拋出異常。blog

<bean id="dao" class="com.jyk.spring.simpletest.Dao"></bean>
    
<bean id="service" class="com.jyk.spring.simpletest.Service" autowire="byType"></bean>
    
<bean id="action" class="com.jyk.spring.simpletest.Action" autowire="byType"></bean>

      (3)constructor 與byType的方式相似,不一樣之處在於它應用於構造器參數。若是在容器中沒有找到與構造器參數類型一致的bean,那麼將會拋出異常。而且 constructor會優先查找參數比較多的構造函數

      (4) autodetect 經過bean類的自省機制(introspection)來決定是使用constructor仍是byType方式進行自動裝配。若是發現默認的構造器,那麼將使用byType方式

   1.3 註解形式注入

       Spring提供了一系列註解,經過在Java類中添加各類註解,一樣能夠達到依賴注入的效果。

     @Autowired註解是按類型裝配依賴對象,默認狀況下它要求依賴對象必須存在,若是容許null值,能夠設置它required屬性爲false。

     @Resource註解默認按名稱裝配,若是沒有指定name屬性,而且按照默認的名稱找不到依賴對象時, @Resource註解會回退到按類型裝配。但一旦指定了name屬性,就只能按名稱裝配了。

     區別:@Resource註解和@Autowired同樣,均可以標註在字段或屬性的setter方法上,不一樣的是當@Resource註解標註在字段上,即默認取字段的名稱做爲bean名稱尋找依賴對象,當@Resource註解標註在屬性的setter方法上,即默認取屬性名做爲bean名稱尋找依賴對象。而@Autowired則是以bean類型爲基準。

     @Qualifier註解按名稱裝配。

                  @PostConstruct 指定Bean的初始化方法

       @PreDestroy 指定Bean的銷燬方法

相關文章
相關標籤/搜索