Spring之對象依賴關係(依賴注入Dependency Injection)

承接上篇:java

Spring中,如何給對象的屬性賦值:spring

  1:經過構造函數,以下所示:app

<!-- 1:構造函數賦初始值 -->
<bean id="user1" class="com.bie.po.User">
<constructor-arg value="10010" type="int"></constructor-arg>
      <constructor-arg value="張三" type="java.lang.String"></constructor-arg>
</bean>
函數


   2:經過set方法給屬性注入值,以下所示:this

<!-- 經過set方法給屬性注入值,是經過set方法給屬性賦值的哦,  經過容器注入值-->
<bean id="user" class="com.bie.po.User">
     <property name="id" value="10010"></property>
     <property name="name" value="李四"></property>
 </bean>   
spa

    2.1:經過set方法實現dao的注入,service的注入,action的注入;以下所示:code

       實現上面的前提是已經在對應的類中實現了下面的set方法和私有的類的成員變量的定義;component

       好比:在service層的方法中實現UserDao的定義和set方法的實現。xml

          在action層的方法中實現UserService的定義和set方法的實現。對象

1 private UserDao userDao;
2     public void setUserDao(UserDao userDao) {
3         this.userDao = userDao;
4     }
1 private UserService userService;
2     public void setUserService(UserService userService) {
3         this.userService = userService;
4     }
1 private UserAction userAction;
2     public void setUserAction(UserAction userAction) {
3         this.userAction = userAction;
4     }

<!-- dao的set注入 -->
<bean id="userDao" class="com.bie.dao.UserDao"></bean>
      
<!-- service的set注入 -->
<bean id="userService" class="com.bie.service.UserService">
      <!-- 處理對象的依賴關係,依賴注入 -->
      <property name="userDao" ref="userDao"></property>
</bean>
    
<!-- action的set注入 -->
<bean id="userAction" class="com.bie.action.UserAction">
      <!-- 處理對象的依賴關係,依賴注入 -->
      <property name="userService" ref="userService"></property>
</bean>   

    2.2:經過內部bean實現dao的注入,service的注入,action的注入;以下所示:

        (缺點,至關於局部變量,service和dao只能使用一次,不方便維護)  

<!-- 內部bean -->
<bean id="userAction" class="com.bie.action.UserAction">
      <property name="userService">
          <bean class="com.bie.service.UserService">
             <property name="userDao">
                 <bean class="com.bie.dao.UserDao"></bean>
             </property>
          </bean>
      </property>

</bean>

  

  3:p命名空間,以下所示:

   《 注意:給對象屬性注入值也能夠經過p名稱空間給對象的屬性注入值,可是Spring的版本必須是3.0版本以上才能夠使用

       必須在applicationContext.xml中引入這句話:xmlns:p="http://www.springframework.org/schema/p"

      》

   實現上面的前提是已經在對應的類中實現了下面的set方法和私有的類的成員變量的定義;

     好比:在service層的方法中實現UserDao的定義和set方法的實現。

          在action層的方法中實現UserService的定義和set方法的實現。

<!-- 使用p名稱空間給對象的屬性注入值 -->
<bean id="userDao" class="com.bie.dao.UserDao"></bean>
<bean id="userService" class="com.bie.service.UserService" p:userDao-ref="userDao"></bean>
<bean id="userAction" class="com.bie.service.UserAction" p:userService-ref="userService"></bean>


   4:自動裝配(瞭解便可),以下所示:

    4.1:根據名稱自動裝配:

        實現上面的前提是已經在對應的類中實現了下面的set方法和私有的類的成員變量的定義;

        好比:在service層的方法中實現UserDao的定義和set方法的實現。

           在action層的方法中實現UserService的定義和set方法的實現。

<!-- 自動裝配
        1:根據"名稱"自動裝配,userService注入的屬性,會去IoC容器中自動查詢和屬性名稱同名的對象
            即在service層的方法中實現UserDao的定義的名稱去和IoC容器(applicationContext.xml)中名稱相同的。
-->
<bean id="userDao" class="com.bie.dao.UserDao"></bean>
<bean id="userService" class="com.bie.service.UserService" autowire="byName"></bean>
<bean id="userAction" class="com.bie.service.UserAction" autowire="byName"></bean>  

    4.2:根據類型自動裝配:(必須確保IoC容器[即applicationContext.xml]中只有一個該類型的對象)

        實現上面的前提是已經在對應的類中實現了下面的set方法和私有的類的成員變量的定義;

              好比:在service層的方法中實現UserDao的定義和set方法的實現。

                  在action層的方法中實現UserService的定義和set方法的實現。

<bean id="userDao" class="com.bie.dao.UserDao"></bean>
<bean id="userService" class="com.bie.service.UserService" autowire="byType"></bean>
<bean id="userAction" class="com.bie.service.UserAction" autowire="byType"></bean>


   5:註解(優勢簡化配置,缺點不利於維護~~~做用把對象添加到IoC容器中),以下所示:

    使用註解的開發步驟:《註解和xml配置能夠一塊兒使用的哦~~~》

      (1):先引入context名稱空間

xmlns:context="http://www.springframework.org/schema/context"  

      (2):開啓註解掃描,指定掃描哪個包下面的類;

<!-- 開啓註解掃描 -->
<context:component-scan base-package="要掃描的包的名字"></context:component-scan>

      (3):使用註解,經過註解的方式,把對象加入IoC容器中;

           還有一種簡寫方式,直接寫@Component 和 @Resource,

            @Component加入IoC容器的UserDao對象的引用名稱,默認和類名同樣,且第一個字母小寫。

            @Resource去容器中找UserDao類型的變量,找到後賦值 

       (4):因爲dao層,service層,action層都是用@Component註解容易形成混亂,不能區分是那一層的註解;

         dao層(持久層):@Component--->@Repository

         service層(業務邏輯層):@Component--->@Service

           action層(控制層):@Component--->@Controller

 1 package com.bie.dao;
 2 
 3 import org.springframework.stereotype.Component;
 4 
 5 /** 
 6 * @author BieHongLi 
 7 * @version 建立時間:2017年3月13日 上午10:42:24 
 8 * 
 9 */
10 //註解的意思就是將userDao加入到IoC容器中
11 //這個註解就至關於<bean id="userDao" class="com.bie.dao.UserDao">
12 @Component("userDao")  
13 public class UserDao {
14 
15     public void test(){
16         
17     }
18 }
 1 package com.bie.service;
 2 
 3 import javax.annotation.Resource;
 4 
 5 import org.springframework.stereotype.Component;
 6 
 7 /** 
 8 * @author BieHongLi 
 9 * @version 建立時間:2017年3月13日 上午10:42:24 
10 * 
11 */
12 //註解的意思就是將userService加入到IoC容器中
13 //這個註解就至關於<bean id="userService" class="com.bie.service.userService">
14 @Component("userService")  
15 public class UserService {
16     
17     //這個註解會從IoC容器中找userDao對象,注入到當前字段
18     @Resource(name="userDao")
19     //這個註解至關於這個IoC容器的配置
20     //<bean id="userService" class="com.bie.service.UserService">
21     //    <property name="userDao" ref="userDao"/>
22     //</bean>
23     
24     //上面註解的userDao賦給下面的userDao的值了
25     private UserDao userDao;
26     
27     public void test(){
28         
29     }
30 }
 1 package com.bie.action;
 2 
 3 import javax.annotation.Resource;
 4 
 5 import org.springframework.stereotype.Component;
 6 
 7 /** 
 8 * @author BieHongLi 
 9 * @version 建立時間:2017年3月13日 上午10:42:24 
10 * 
11 */
12 //註解的意思就是將userAction加入到IoC容器中
13 //這個註解就至關於<bean id="userAction" class="com.bie.action.userAction">
14 @Component("userAction")  
15 public class UserAction {
16     
17     //這個註解會從IoC容器中找userService對象,注入到當前字段
18     @Resource(name="userService")
19     //這個註解至關於這個IoC容器的配置
20     //<bean id="userAction" class="com.bie.action.userAction">
21     //    <property name="userService" ref="userService"/>
22     //</bean>
23     
24     //上面註解的userService賦給下面的userService的值了
25     private UserDao userService;
26     
27     public void test(){
28         
29     }
30 }

Spring的IoC容器是個好東西啊~~~

相關文章
相關標籤/搜索