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

日目晶……

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

UserDao 接口

package com.itheima.ioc;
public interface UserDao {
public void say();
}

 

该接口实现类UserDaoImpl

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

 

  • 控制反转的概念

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

……
UserDaoImpl userDao = new UserDaoImpl();
userDao.say();
……  

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

具体做法:

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

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

  

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

package com.itheima.ioc;
/**
* 通过Spring容器来获取实现类对象
* 而不是通过new
*/
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIoc {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.say();
}
}

  

  • 依赖注入的概念

UserService代码:

package com.itheima.ioc;
public interface UserService {
public void say();
}

 

UserServiceImpl 实现类:

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

public class UserServiceImpl implements UserService {
UserDao userDao=new UserDaoImpl();
public void setUserDao(UserDao userDao){
this.userDao= userDao;
}
@Override
public void say() {
// TODO Auto-generated method stub
this.userDao.say();
System.out.println("userService say hello world~");
}
}

 

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

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

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

做法如下:

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

public class UserServiceImpl implements UserService {
//声明UserDao属性
private UserDao userDao ; public void setUserDao(UserDao userDao){
this.userDao= userDao;
}
@Override
public void say() {
// TODO Auto-generated method stub
this.userDao.say();
System.out.println("userService say hello world~");
}
}

  

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

<beans xmlns="……">
<bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
<bean id = "userService" class = "com.itheima.ioc.UserServiceImpl">
<!-- 将id=userDao的实例注入到userSericeImpl -->
<property name="userDao" ref = "userDao"/>
</bean>
</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. Linux使用wget、安装Python

    原文:https://blog.csdn.net/ghost_chou/article/details/81905302 1.指定需要安装的目录或创建并访问到该选择的目录下. mkdir /data/ ...

  2. Android 简单统计文本文件字符数、单词数、行数Demo

    做的demo是统计文本文件的字符数.单词数.行数的,首先呢,我们必须要有一个文本文件.所以我们要么创建一个文本文件,并保存,然后再解析:要么就提前把文本文件先放到模拟器上,然后检索到文本名再进行解析. ...

  3. CMMI 2.0术语变化

    过程域 vs. 实践域 “过程域”(Process Areas,PAs)在CMMI 2.0中变成了“实践域(Practice Areas,PAs)”.这样的改变,强调了CMMI 2.0是最佳实践的集合 ...

  4. C#语言中的修饰符

    public:公有访问.不受任何限制. private:私有访问.只限于本类成员访问,子类和实例都不能访问. protected:保护访问.只限于本类和子类访问,实例不能访问. internal:内部 ...

  5. [转]Lua和Lua JIT及优化指南

    一.什么是lua&luaJit lua(www.lua.org)其实就是为了嵌入其它应用程序而开发的一个脚本语言, luajit(www.luajit.org)是lua的一个Just-In-T ...

  6. windows PHP 安装 redis 外加扩展

    前置条件:为php7.2搭建redis扩展的前提是在本机上已经成功搭建好php的运行环境,我的电脑的运行环境时 apache2.4+mysql5.5+php7.2. 操作系统为64位,编译环境为Mic ...

  7. Eclipse 从git导入maven多模块项目

    原文地址:https://blog.csdn.net/xiongyouqiang/article/details/78903975 以https://github.com/xiongyouqiang/ ...

  8. F2 - Spanning Tree with One Fixed Degree - 并查集+DFS

    这道题还是非常有意思的,题意很简单,就是给定一个图,和图上的双向边,要求1号节点的度(连接边的条数)等于K,求这棵树的生成树. 我们首先要解决,如何让1号节点的度时为k的呢???而且求的是生成树,意思 ...

  9. vue动态设置初始页

  10. nodejs部署方式-pm2

    目前Nodejs开发中有很多痛点,其中有一个是修改完代码以后需要我们重启服务才能看到效果.这样一次次的杀进程.重启,杀进程.重启很让人头大.程序员是最痛恨重复工作的物种,之前有了解过的同学可能知道 f ...