承接上篇:

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方法的实现。

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

<!-- 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

 package com.bie.dao;

 import org.springframework.stereotype.Component;

 /**
* @author BieHongLi
* @version 创建时间:2017年3月13日 上午10:42:24
*
*/
//注解的意思就是将userDao加入到IoC容器中
//这个注解就相当于<bean id="userDao" class="com.bie.dao.UserDao">
@Component("userDao")
public class UserDao { public void test(){ }
}
 package com.bie.service;

 import javax.annotation.Resource;

 import org.springframework.stereotype.Component;

 /**
* @author BieHongLi
* @version 创建时间:2017年3月13日 上午10:42:24
*
*/
//注解的意思就是将userService加入到IoC容器中
//这个注解就相当于<bean id="userService" class="com.bie.service.userService">
@Component("userService")
public class UserService { //这个注解会从IoC容器中找userDao对象,注入到当前字段
@Resource(name="userDao")
//这个注解相当于这个IoC容器的配置
//<bean id="userService" class="com.bie.service.UserService">
// <property name="userDao" ref="userDao"/>
//</bean> //上面注解的userDao赋给下面的userDao的值了
private UserDao userDao; public void test(){ }
}
 package com.bie.action;

 import javax.annotation.Resource;

 import org.springframework.stereotype.Component;

 /**
* @author BieHongLi
* @version 创建时间:2017年3月13日 上午10:42:24
*
*/
//注解的意思就是将userAction加入到IoC容器中
//这个注解就相当于<bean id="userAction" class="com.bie.action.userAction">
@Component("userAction")
public class UserAction { //这个注解会从IoC容器中找userService对象,注入到当前字段
@Resource(name="userService")
//这个注解相当于这个IoC容器的配置
//<bean id="userAction" class="com.bie.action.userAction">
// <property name="userService" ref="userService"/>
//</bean> //上面注解的userService赋给下面的userService的值了
private UserDao userService; public void test(){ }
}

Spring的IoC容器是个好东西啊~~~

Spring之对象依赖关系(依赖注入Dependency Injection)的更多相关文章

  1. Spring点滴七:Spring中依赖注入(Dependency Injection:DI)

    Spring机制中主要有两种依赖注入:Constructor-based Dependency Injection(基于构造方法依赖注入) 和 Setter-based Dependency Inje ...

  2. 简明依赖注入(Dependency Injection)

    前言 这是因特奈特上面不知道第几万篇讲依赖注入(Dependency Injection)的文章,但是说明白的却寥寥无几,这篇文章尝试控制字数同时不做大多数. 首先,依赖注入的是一件很简单的事情. 为 ...

  3. 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)

    控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...

  4. 14.AutoMapper 之依赖注入(Dependency Injection)

    https://www.jianshu.com/p/f66447282780   依赖注入(Dependency Injection) AutoMapper支持使用静态服务定位构建自定义值解析器和自定 ...

  5. 依赖注入 | Dependency Injection

    原文链接: Angular Dependency Injection翻译人员: 铁锚翻译时间: 2014年02月10日说明: 译者认为,本文中所有名词性的"依赖" 都可以理解为 & ...

  6. AngularJS - 依赖注入(Dependency Injection)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 依赖注入 依赖注入是软件设计模式中的一部分,用于处理组件是如何得到它说依赖的其它组件的. ...

  7. 理解依赖注入(Dependency Injection)

    理解依赖注入 Yii2.0 使用了依赖注入的思想.正是使用这种模式,使得Yii2异常灵活和强大.千万不要以为这是很玄乎的东西,看完下面的两个例子就懂了. class SessionStorage { ...

  8. DAX的圈圈大坑:循环依赖关系错误circular dependency (单表篇)

    使用DAX中的某些函数特别类似Calculate这种函数创建计算列时很容易出现一种错误,叫做检测到循环依赖关系,即:A circular dependency was detected.对于刚接触Da ...

  9. 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controller)

    参考链接: 依赖注入(DI) or 控制反转(IoC) laravel 学习笔记 —— 神奇的服务容器 PHP 依赖注入,从此不再考虑加载顺序 名词解释 IoC(Inversion of Contro ...

随机推荐

  1. mysql alter 用法,修改表,字段等信息

    一: 修改表信息 1.修改表名 alter table test_a rename to sys_app; 2.修改表注释 alter table sys_application comment '系 ...

  2. MySQL事物(一)事务隔离级别和事物并发冲突

    数据库的操作通常为写和读,就是所说的CRUD:增加(Create).读取(Read).更新(Update)和删除(Delete).事务就是一件完整要做的事情.事务是恢复和并发控制的基本单位.事务必须始 ...

  3. Tomcat环境变量,端口号,编码格式,项目路径,默认页的配置

    Tomcat的配置 1.配置环境变量 新建名为:CATALINA_HOME的系统变量,值为我们安装tomcat的目录 2端口号及编码的配置: 找到tomcat安装目录下的sonf下的server文件, ...

  4. JavaScript之从浏览器一键获取教务处个人课程信息【插件】

    由于博主的个人网站(:http://www.johnnyzen.cn/),每学期都需要更新呈现课程的静态信息,由于课程量多,而且手动爬取很冗杂,特别想自动化实现.这不,今天终于有点时间了,把之前写no ...

  5. luogu P2508 [HAOI2008]圆上的整点

    传送门 推荐去bzoj看个视频了解一下 不要妄想视频直接告诉你题解 但是视频告诉了你后面要用的东西 首先我们要求的是\(x^2+y^2=n^2(x,y\in Z)\)的\((x,y)\)对数,可以转化 ...

  6. 北洋UAM-05LX(网口系列适用)ROS节点

    参考创客智造ROS与激光雷达入门教程 说明: 介绍ROS如何接入Hokuyo网口的雷达及基本使用 测试雷达:UAM-05LX采用太网接口,如果型号是USB口的参考教程 ros wiki: http:/ ...

  7. 【工具测试】Acunetix 11-登录后扫描的功能

    1.概要 在测试的过程中,会给一些只有登录口的测试站点,只有登录后才能访问更多的页面. Acunetix 11的登录后扫描功能摸索了老半天,原来这么神奇.学习了! 2.操作 登录之后 - [Add T ...

  8. python学习之argparse模块

    python学习之argparse模块 一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行 ...

  9. 内核中container_of宏的详细分析【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637597.html 内核中container_of宏的详细分析 16年2月28日09:00:37 内核中 ...

  10. Device Tree常用方法解析【转】

    转自:https://blog.csdn.net/airk000/article/details/21345159 Device Tree常用方法解析 Device Tree在Linux内核驱动中的使 ...