最近要搞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. jsp内置对象-session对象

    一.session概述 隐含对象session是javax.servlet.http.HttpSession接口实现类的对象,用于保存用户的状态信息. 在web开发中,服务器为每个用户浏览器创建一个会 ...

  2. vue 使用定时器setInterval

    来自:https://www.jianshu.com/p/180957762852 侵删 beforeMount() { //车辆进出设置定时器,每3秒刷新一次 var self = this; cl ...

  3. java:数据结构(二)栈的应用(进制转换全收集)

    说到进制转换,java已经封装了基本的方法,在竞赛中使用封装的方法自然能节省大量时间 另一位仁兄介绍的封装好的方法: https://blog.csdn.net/m0_37961948/article ...

  4. dede二级导航

    {dede:channelartlist} {dede:field name='typeurl'/}'——{dede:field name='typename'/} {dede:channel typ ...

  5. Spark RPC框架源码分析(二)RPC运行时序

    前情提要: Spark RPC框架源码分析(一)简述 一. Spark RPC概述 上一篇我们已经说明了Spark RPC框架的一个简单例子,Spark RPC相关的两个编程模型,Actor模型和Re ...

  6. MySQL随笔(2)

    索引本身是一个独立的存储单位,在该单位里边有记录着数据表某个字段和字段对应的物理空间.索引内部有算法支持,可以说查询速度非常快. 聚簇索引;聚簇索引不是单独的索引而是一种数据存储方式;聚簇索引的优点是 ...

  7. C# -- 使用Parallel并行执行任务

    C#:使用Parallel并行执行任务 1. 代码实现 class Program { static void Main(string[] args) { TestParallel(); Consol ...

  8. ubunru18.04下面安装docker

    sudo apt-get updat // 更新apt包索引 sudo apt-get remove docker docker-engine docker-ce docker.io // 卸载旧版本 ...

  9. .NET开源快速开发框架Colder发布 (NET452+AdminLTE版)

    .NET开源快速开发框架Colder(NET452+AdminLTE版) 引言 半年前将基于Easyui的快速开发框架开源,三个版本(NET4.52,NETCore和NET4.0)总共荣获200+星, ...

  10. Django Rest Framework(二)

    •基于Django 先创建一个django项目,在项目中创建一些表,用来测试rest framework的各种组件 models.py class UserInfo(models.Model): &q ...