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


承接上篇:

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

  1:通過構造函數,如下所示:

<!-- 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方法給屬性注入值,如下所示:

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

    2.1:通過set方法實現dao的注入,service的注入,action的注入;如下所示:

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

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

          在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容器是個好東西啊~~~


免責聲明!

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



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