spring的DI.IoC是什么
最近要搞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是什么的更多相关文章
- spring框架DI(IOC)和AOP 原理及方案
http://www.blogjava.net/killme2008/archive/2007/04/20/112160.html http://www.oschina.net/code/snippe ...
- Spring的DI(Ioc) - 注入bean 和 基本数据类型
注入bean有两种方式: 注入其他bean: 方式一 <bean id="orderDao" class="cn.itcast.service.OrderDaoBe ...
- Spring的DI(Ioc) - 利用构造器注入
1: 在给对象提供构造器 public class PersonServiceImpl implements PersonService { private PersonDao personDao; ...
- Spring的DI(Ioc) - 注入集合类型
1: 首先给service添加集合类型的属性,并提供getter, setter package cn.gbx.serviceimpl; import java.util.ArrayList; imp ...
- spring.net中间IoC、DI和MVC
轮廓 spring.net它是开源的业务层框架,功能很强大,它归结到什么都有3能:面向切面编程:IoC和DI:提供综合型的框架支持,本片博客主要说一下IoC和DI.和其提供的对MVC框架的支持. Io ...
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- Spring系列(1)--IOC 和 DI
IOC 和 DI IOC 原理 xml 配置文件配置 bean dom4j 读取配置文件 工厂设计模式 反射机制创建对象 applicationContext.xml 配置文件,该配置文件名可自定义: ...
- Spring核心思想——IOC和DI
基本概念 IOC是什么? IOC(Inversion of Control)控制反转,IOC是一种新的Java编程模式,目前很多轻量级容器都在广泛使用的模式. IOC解决了什么问题? ...
- Helloworld之Spring依赖注入/控制反转(DI/IoC)版
Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训刚開始学习的人理解Spring中的依赖注入的基本概念. 先介绍依 ...
随机推荐
- java基础(四):谈谈java中的IO流
1.字节流 1.1.字节输出流output 1.1.1.数据写入文件中 通过api查找output.找到很多,其中java.io.OutputStream,OutputStream: 输出字节流的超类 ...
- Apache2配置多域名站点及支持https
0x00 预备条件 申请SSL证书 建立对应站点目录 开放443端口 0x01 配置sites-available文件 执行 vi /etc/apache2/sites-available/zecoc ...
- HTTP中GET和POST的区别主要是那些,面试中可以加分的该说那些?
面试回答: GET请求在URL中传送的参数是有长度限制的,而POST没有. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息. GET参数通过URL传递,POST放在Re ...
- django mongodb配置
#settings.py import os from mongoengine import * BASE_DIR = os.path.dirname(os.path.dirname(os.path. ...
- NPM -- 初探--01
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...
- SQL server数据库表碎片比例查询语句
For rebuilding index, here is also a script to figure out the fragmentation and decide whether rebui ...
- Vue.js02:数据绑定v-model用法
<!-- v-model 实现数据的双向绑定 --> <!-- v-model 只能用在表单元素中 --> 示例: <!DOCTYPE html> <!-- ...
- js坚持不懈之12:var b = {a:1};
今天看到一篇博客,在声明一个变量的时候用了如下格式的语法: var b = {a:1}; 不明白,百度一下.作如下解释: var: 声明一个变量 b: 表示变量的名称 =: 赋值符号 {}: 表示一个 ...
- Carthage入门篇-安装和使用
在iOS开发过程中,用到最多的三方库管理工具也许是Cocoapods.Cocoapods会自动为你创建一个workspace,然后自动将你要用到的三方库集成到Project中,而整个过程,你只需要对P ...
- 数据库【mysql篇】学习笔记
Windows服务 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意 ...