Spring的依賴注入


一、Spring的依賴注入(DI)

          1.依賴注入:

                IOC的作用:降低程序之間的耦合(依賴關系)

                概念:依賴關系的管理交給spring維護,在當前類需要用到其他類的對象,由spring為我們提供,只需在配置文件中說明關系的維護;

           2.能夠注入的數據有三類:

                 1) 基本類型和string

                 2) 其他bean類型(在配置文件中或者注解配置過的bean)

                 3) 復雜集合類型

           3.注入方式

                  1) 使用構造函數               

<!--
      構造函數注入:
      使用的標簽:constructor-arg
      標簽出現的位置:bean標簽內部
      標簽的屬性
           type:用於指定要注入的數據的數據類型,該數據構造函數中某個或某些參數類型
           index:用於指定要注入的數據給構造函數中指定索引位置的參數賦值,索引位置從0開始
           name:用於指定給構造函數中指定名稱的參數賦值(常用)
           =================以上用於指定個給構造函數中那個參數賦值==========
           value:用於提供基本類型和string類型數據
           ref:用於指定其他的bean類型數據,它指的就是在spring的Ioc核心容器中出現過的bean對象
       優勢:在獲取bean對象時,注入數據是必須的操作,否則對象無法創建成功
       弊端:改變了bean對象的實例化方式,使我們在創建對象時,如果融不到這些數據,頁必須提供
     -->
    <bean id="accountService" class="com.li.service.impl.AccountServiceImpl">
        <constructor-arg name="name" value="text"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
        <constructor-arg name="birthday" ref="now"></constructor-arg>
    </bean>
<!--配置一個日期對象-->
<bean id="now" class="java.util.Date"></bean>
public class AccountServiceImpl implements IAccountService {
   //如果經常變化的數據不適合的注入方式
      private String name;
      private Integer age;
      private Date birthday;
      public AccountServiceImpl(String name,Integer age,Date birthday)
      {
          this.name=name;
          this.age=age;
          this.birthday=birthday;
      }
    public void saveAccount() {
        System.out.println("service中的saveAccount執行了******");
    }
}
 
         

 

 

 

          2.1.)set方法注入(常用)

<!--set方法注入      常用
        涉及的標簽:property
        出現的位置:bean標簽的內部
         name:用於注入時所調用的set方法名稱
         value:用於提供基本類型和string類型數據
         ref:用於指定其他的bean類型數據,它指的就是在spring的Ioc核心容器中出現過的bean對象
      優勢:創建對象時沒有明確的限制,可以直接使用默認構造函數
      弊端:如果由某個成員,必須有值,則獲取對象時,有可能set方法沒有執行
          -->
    <bean id="accountService2" class="com.li.service.impl.AccountServiceImpl2">
         <property name="name" value="test"></property>
        <property name="age" value="18"></property>
        <property name="birthday" ref="now"></property>
    </bean>
public class AccountServiceImpl2 implements IAccountService {
      private String name;
      private Integer age;
      private Date birthday;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public void saveAccount() {
        System.out.println("service中的saveAccount執行了******");
    }
 

 

          2.2.)使用set注入完成復雜集合類型數據

<!--
       復雜類型的注入/集合類型的注入
       用於給List結構集合注入的標簽
            list array set
       用於給List結構集合注入的標簽
            map props
       結構相同,標簽可以互換
    -->
    <bean id="accountService3" class="com.li.service.impl.AccountServiceImpl3">
        <property name="myStrs">
            <array>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </array>
        </property>
        <property name="myList">
            <list>
                <value>AAA</value>
                <value>BBB</value>
                <value>CCC</value>
            </list>
        </property>
        <property name="mySet">
            <set>
                <value>AAA</value>
                <value>BBB</value>
                <value>CCC</value>
            </set>
        </property>
        <property name="myMap">
            <map>
                <entry key="testA" value="aaa"></entry>
                <entry key="testB" value="bbb"></entry>
            </map>
        </property>
        <property name="myProp">
            <props>
                <prop key="testC">ccc</prop>
                <prop key="testD">ddd</prop>
            </props>
        </property>
    </bean>
public class AccountServiceImpl3 implements IAccountService {
   private String[] myStrs;
   private List<String> myList;
   private Set<String> mySet;
   private Map<String,String> myMap;
   private Properties myProp;

    public void setMyStrs(String[] myStrs) {
        this.myStrs = myStrs;
    }

    public void setMyList(List<String> myList) {
        this.myList = myList;
    }

    public void setMySet(Set<String> mySet) {
        this.mySet = mySet;
    }

    public void setMyMap(Map<String, String> myMap) {
        this.myMap = myMap;
    }

    public void setMyProp(Properties myProp) {
        this.myProp = myProp;
    }

    public void saveAccount() {
        System.out.println(Arrays.toString(myStrs));
        System.out.println(myList);
        System.out.println(mySet);
        System.out.println(myMap);
        System.out.println(myProp);
    }
 
         

 

 

          3)注解方式

                 * 用於創建對象:

                            作用和XML配置文件的<bean>標簽的實現功能一致;

                    1) @Component:  作用:用於當前類存入spring容器

                                                    屬性:value:  用於指定bean的id,當我們不寫時,默認為當前類的名稱且首字母小寫

                    2)@Controller : 用於表現層

                    3)@Service: 用於業務層

                    4)@Repository: 用於持久層

                     以上三個注解和Component功能一樣;

                 * 用於注入數據:

                         作用和XML配置文件中的bean標簽中的<property>作用一樣;

                    1)@Autowried

                           作用:自動按類型注入,只要容器中由唯一的bean對象類型和要注入的變量類型匹配,就可以成功注入

                          出現位置:可以為成員變量,也可以為方法

                     2)@Qualifier: 

                             作用:再按照類中注入的基礎之上再按照名稱注入,它在給類成員注入時不能單獨使用和Autowired配合使用,但是給方法注入時可以

                            屬性:value:用於指定注入bean的id

                      3) @Resources 

                            作用:直接按照bean的id注入,它可以獨立使用

                            屬性:name:用於指定bean的id

                             以上三種注入只能注入其他bean類型的數據,而基本類型和String類型無法使用上述注解實現

                       4) @Value

                              作用:用於注入基本類型和String類型數據

                              屬性:value:用於指定數據的值,它可以使用spring中的spEL(也就是spring的el表達式)

                             SpEl的寫法:${表達式}

                * 用於改變作用范圍

                       作用和在bean標簽中使用scopoe屬性實現的功能一樣的

                      Scope

                          作用:用於指定bean的作用范圍

                          屬性:value:指定范圍取值。常用的值:singleton(單例) prototype(多例)

               * 和生命周期相關

                       作用和在bean標簽中使用init_method和destroy-method的作用一樣

                        PreDestroy:用於指定銷毀

                        PostConstruct:用於指定初始化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM