• 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容器是个好东西啊~~~

  • 相关阅读:
    linux service 例子
    YII2自动初始化脚本
    ubuntu 如何在命令行打开当前目录
    mysql 储存过程
    Mysql 随笔记录
    Lack of free swap space on Zabbix server
    意外发现PHP另一个显示转换类型 binary
    常用的排序代码
    线程的实现方式之内核支持线程和用户级线程
    寻找二叉树中的最低公共祖先结点----LCA(Lowest Common Ancestor )问题(递归)
  • 原文地址:https://www.cnblogs.com/biehongli/p/6541360.html
Copyright © 2020-2023  润新知