天天看點

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方法的實作。

<!-- 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> <!-- 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 -->       <property name="userService">           <bean class="com.bie.service.UserService">              <property name="userDao">                  <bean class="com.bie.dao.UserDao"></bean>              </property>           </bean>       </property>   

  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="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="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]中隻有一個該類型的對象)

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

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

<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

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