最近要搞spring的单元测试,不得已啊啊啊啊啊啊啊啊啊又要开始搞spring……

日目晶……

搞这几个概念,先甩一部分代码:

UserDao 接口

  1. package com.itheima.ioc;
  2. public interface UserDao {
  3. public void say();
  4. }

 

该接口实现类UserDaoImpl

  1. package com.itheima.ioc;
  2. public class UserDaoImpl implements UserDao {
  3. @Override
  4. public void say() {
  5. // TODO Auto-generated method stub
  6. System.out.println("userDao say hello world");
  7. }
  8. }

 

  • 控制反转的概念

在一般的设计中,如果要调用UserDaoImpl的say()方法,就要new一个UserDaoImpl类出来,比如以下的方法:

  1. ……
  2. UserDaoImpl userDao = new UserDaoImpl();
  3. userDao.say();
  4. ……  

在spring中呢,有个概念叫IoC(Inversion  of Control 即控制反转),它通过框架设定,可以通过配置文件,在spring的容器(可以理解为一个装满了对象的瓶子)中取一个现成的UserDaoImpl的实例出来,而不需要new一个。

具体做法:

编辑applicationContext.xml,添加一个userDao的bean(可以理解为一个类,添加之后,spring容器中就有这个类的对象)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans ……>
  3. <!-- 添加UserDaoImpl实例,id=userDao -->
  4. <bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
  5. </beans>

  

调用userDaoImpl的say()方法代码如下:

  1. package com.itheima.ioc;
  2. /**
  3. * 通过Spring容器来获取实现类对象
  4. * 而不是通过new
  5. */
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. public class TestIoc {
  8. public static void main(String[] args) {
  9. ClassPathXmlApplicationContext applicationContext =
  10. new ClassPathXmlApplicationContext("applicationContext.xml");
  11. UserDao userDao = (UserDao) applicationContext.getBean("userDao");
  12. userDao.say();
  13. }
  14. }

  

  • 依赖注入的概念

UserService代码:

  1. package com.itheima.ioc;
  2. public interface UserService {
  3. public void say();
  4. }

 

UserServiceImpl 实现类:

这里的实现类中,我们要重写say()方法,say()方法有一个现成的UserDaoImpl方法,我们直接拿过来用,一般是这么写的:

  1. public class UserServiceImpl implements UserService {
  2. UserDao userDao=new UserDaoImpl();
  3. public void setUserDao(UserDao userDao){
  4. this.userDao= userDao;
  5. }
  6. @Override
  7. public void say() {
  8. // TODO Auto-generated method stub
  9. this.userDao.say();
  10. System.out.println("userService say hello world~");
  11. }
  12. }

 

这么写没问题,不过spring容器里面有个现成的UserDaoImpl,还new一个,很浪费,直接拿过来用会更方便。

这个直接拿过来用的搞法,叫DI(Dependency Injection ,即依赖注入)。

依赖注入有两种做法,一个是setter,一个是构造方法,这里只给setter的方法,构造方法的我看的书上还没讲,不想动。

做法如下:

改写UserServiceImpl,把new变成私有属性

  1. public class UserServiceImpl implements UserService {
  2. //声明UserDao属性
  3. private UserDao userDao ;
  4.  
  5. public void setUserDao(UserDao userDao){
  6. this.userDao= userDao;
  7. }
  8. @Override
  9. public void say() {
  10. // TODO Auto-generated method stub
  11. this.userDao.say();
  12. System.out.println("userService say hello world~");
  13. }
  14. }

  

编写配置文件,把userDao Bean添加到userService下面:

  1. <beans xmlns="……">
  2. <bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
  3. <bean id = "userService" class = "com.itheima.ioc.UserServiceImpl">
  4. <!-- 将id=userDao的实例注入到userSericeImpl -->
  5. <property name="userDao" ref = "userDao"/>
  6. </bean>
  7. </beans>

  

 

 

 

总结:

1.将new转化为从容器中拿,这就是IoC的工作机制,即控制反转+依赖注入,这两个概念可以理解为同一个东西

2.控制权由硬代码new一个实体类,转移到spring容器分配,即为控制反转;

3.spring负责将容器内的对象,注入给调用者,即为依赖注入。

  

spring的DI.IoC是什么的更多相关文章

  1. spring框架DI(IOC)和AOP 原理及方案

    http://www.blogjava.net/killme2008/archive/2007/04/20/112160.html http://www.oschina.net/code/snippe ...

  2. Spring的DI(Ioc) - 注入bean 和 基本数据类型

    注入bean有两种方式: 注入其他bean: 方式一 <bean id="orderDao" class="cn.itcast.service.OrderDaoBe ...

  3. Spring的DI(Ioc) - 利用构造器注入

    1: 在给对象提供构造器 public class PersonServiceImpl implements PersonService { private PersonDao personDao; ...

  4. Spring的DI(Ioc) - 注入集合类型

    1: 首先给service添加集合类型的属性,并提供getter, setter package cn.gbx.serviceimpl; import java.util.ArrayList; imp ...

  5. spring.net中间IoC、DI和MVC

    轮廓 spring.net它是开源的业务层框架,功能很强大,它归结到什么都有3能:面向切面编程:IoC和DI:提供综合型的框架支持,本片博客主要说一下IoC和DI.和其提供的对MVC框架的支持. Io ...

  6. 一) Spring 介绍、IOC控制反转思想与DI依赖注入

    一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...

  7. Spring系列(1)--IOC 和 DI

    IOC 和 DI IOC 原理 xml 配置文件配置 bean dom4j 读取配置文件 工厂设计模式 反射机制创建对象 applicationContext.xml 配置文件,该配置文件名可自定义: ...

  8. Spring核心思想——IOC和DI

    基本概念 IOC是什么?     IOC(Inversion of Control)控制反转,IOC是一种新的Java编程模式,目前很多轻量级容器都在广泛使用的模式. IOC解决了什么问题?      ...

  9. Helloworld之Spring依赖注入/控制反转(DI/IoC)版

    Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训刚開始学习的人理解Spring中的依赖注入的基本概念. 先介绍依 ...

随机推荐

  1. java基础(四):谈谈java中的IO流

    1.字节流 1.1.字节输出流output 1.1.1.数据写入文件中 通过api查找output.找到很多,其中java.io.OutputStream,OutputStream: 输出字节流的超类 ...

  2. Apache2配置多域名站点及支持https

    0x00 预备条件 申请SSL证书 建立对应站点目录 开放443端口 0x01 配置sites-available文件 执行 vi /etc/apache2/sites-available/zecoc ...

  3. HTTP中GET和POST的区别主要是那些,面试中可以加分的该说那些?

    面试回答: GET请求在URL中传送的参数是有长度限制的,而POST没有. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息. GET参数通过URL传递,POST放在Re ...

  4. django mongodb配置

    #settings.py import os from mongoengine import * BASE_DIR = os.path.dirname(os.path.dirname(os.path. ...

  5. NPM -- 初探--01

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...

  6. SQL server数据库表碎片比例查询语句

    For rebuilding index, here is also a script to figure out the fragmentation and decide whether rebui ...

  7. Vue.js02:数据绑定v-model用法

    <!-- v-model 实现数据的双向绑定 --> <!-- v-model 只能用在表单元素中 --> 示例: <!DOCTYPE html> <!-- ...

  8. js坚持不懈之12:var b = {a:1};

    今天看到一篇博客,在声明一个变量的时候用了如下格式的语法: var b = {a:1}; 不明白,百度一下.作如下解释: var: 声明一个变量 b: 表示变量的名称 =: 赋值符号 {}: 表示一个 ...

  9. Carthage入门篇-安装和使用

    在iOS开发过程中,用到最多的三方库管理工具也许是Cocoapods.Cocoapods会自动为你创建一个workspace,然后自动将你要用到的三方库集成到Project中,而整个过程,你只需要对P ...

  10. 数据库【mysql篇】学习笔记

    Windows服务 -- 启动MySQL    net start mysql-- 创建Windows服务    sc create mysql binPath= mysqld_bin_path(注意 ...