Spring (一) IOC ( Inversion Of Control )
- 前序
- 现在小米手机很火就还拿小米手机来举例子,上一篇写的关于SSH框架搭建是从小米手机公司内个整个流程方面来考虑,如何提高效率生产效率,这篇博客主要从公司外部环境说明如何提高生产效率,那么怎么才能提高呢?
- 这就需要找专业的厂商来管理某一部分的生产,代替自己生产,就好比利用Spring的IOC容器来管理对象的创建一样,而不是在程序里面代码进行创建,让我们来看一下官方丁描述。
- 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
- 实现IOC的框架并不是只有一种Spring,还有EJB3.0、Apache Avalon等都实现了这种功能,这里我们只看一下Spring是怎么来实现的。
- 实现原理
- 实现IOC有两种方式分别为DI(Dependency Injection)和DL(Dependency Lookup)。如下图
- 依赖查找(DL)
- 容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。
- 依赖注入(DI)
- 组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。大家常用的就是这种方式啦,记得看视频的时候常常提及DI依赖注入,除了我们知道的构造函数、Setter()两种注入方法,还有一种是Interface注入,当然我们最最常用的还是Setter注入了。
- 依赖注入之所以更流行是因为它是一种更可取的方式:让容器全权负责依赖查询,受管组件只需要暴露JavaBean的setter方法或者带参数的构造子或者接口,使容器可以在初始化时组装对象的依赖关系。其与依赖查找方式相比,主要优势为:
- 查找定位操作与应用代码完全无关。
- 不依赖于容器的API,可以很容易地在任何容器以外使用应用对象。
- 不需要特殊的接口,绝大多数对象可以做到完全不必依赖容器。
- 如果你还想知道IOC是怎么样注入、实例化对象的,你需要研究一下Java反射机制,IOC是利用配置文件来定位、实例化对象滴,用配置文件实例化就会用到反射技术,简单说一下思路。
- 在Java中有一个特殊Class可以定位所有class类,又提供了Field、Method、Contructor等类,它们的对象分别对应指定到那个类的属性、方法、构造函数,如此一来通过一个超类Class即可拿取到所有类的所有信息,反射的最基础原理就是这样实现的,更详细讲解请点击这里:Class类与Java反射详解。
- 实现IOC有两种方式分别为DI(Dependency Injection)和DL(Dependency Lookup)。如下图
- Spring物料管理实例
- 我们仅仅截取物料例子中的业务逻辑层调用Dao部分代码拿过来看一看,是如何利用IOC容器来管理的。
- 实现之前代码
- 物料业务类
package com.bjpowernode.drp.service; import com.bjpowernode.drp.AppException;
import com.bjpowernode.drp.BeanFactory;
import com.bjpowernode.drp.DBUtil;
import com.bjpowernode.drp.PageModel;
import com.bjpowernode.drp.dao.ItemDao;
import com.bjpowernode.drp.domain.Item; /**
* IOC
* @author Administrator
*
*/
public class ItemServiceImpl implements ItemService { public void addItem(Item item) { try {
itemDao.addItem(item);
} catch (Exception e) {
e.printStackTrace();
throw new AppException("添加物料失败!");
} } private ItemDao getItemDao() {
ItemDao itemDao = (ItemDao)BeanFactory.getInstance().getBean(ItemDao.class);
return itemDao;
}
}
- IOC管理后
- 物料业务类
package com.bjpowernode.drp.service; import com.bjpowernode.drp.AppException;
import com.bjpowernode.drp.PageModel;
import com.bjpowernode.drp.dao.ItemDao;
import com.bjpowernode.drp.domain.Item; /**
* IOC
* @author Administrator
*
*/
public class ItemServiceImpl implements ItemService { private ItemDao itemDao; public void setItemDao(ItemDao itemDao) {
this.itemDao = itemDao;
} public void addItem(Item item) { try {
itemDao.addItem(item);
} catch (Exception e) {
e.printStackTrace();
throw new AppException("添加物料失败!");
}
} }- 配置文件
<?xml version="1.0" encoding="UTF-8"?> <!--
- Application context definition for JPetStore's business layer.
- Contains bean references to the transaction manager and to the DAOs in
- dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <!-- 配置Service里面的itemDao,dataDictService -->
<bean id="itemService" class="com.bjpowernode.drp.service.ItemServiceImpl">
<property name="itemDao" ref="itemDao"></property>
</bean> <bean id="dataDictService" class="com.bjpowernode.drp.service.DataDictServiceImpl">
<property name="dataDictDao" ref="dataDictDao"></property>
</bean> </beans>
- 前后代码减少了直接访问Dao层的代码,减少了耦合性,也提高了很多效率,在程序加载的时候就可以把该注入的类都进行注入,不用去等着实例化哪一个类了。
- 小结
- 使用IOC进行开发目前很流行,主要原因是因为它很灵活,给开发带来了方便越来越受到程序员的青睐,这里仅仅是一点基础性总结,更深入的理解还需要在实践中慢慢锻炼!
Spring (一) IOC ( Inversion Of Control )的更多相关文章
- 【Java_Spring】控制反转IOC(Inversion of Control)
1. IOC的概念 控制反转IoC(Inversion of Control)是一种设计思想,而DI(依赖注入)是实现IoC的一种方法.在没有使用IOC的程序中,对象间的依赖关系是靠硬编码的方式实现的 ...
- Spring基础[IOC/DI、AOP]
一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被 ...
- Spring实现IOC
目录 一.使用XML配置的方式实现IOC 二.使用Spring注解配置IOC 三.自动装配 四.零配置实现IOC 五.示例下载 控制反转IoC(Inversion of Control),是一种设计思 ...
- Spring学习总结(一)——Spring实现IoC的多种方式
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...
- Spring之IoC总结帖
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development a ...
- 关于Spring的IOC和DI
原始调用模型 Spring的演化过程 Spring的调用过程 ======================================= IoC[理解][应用][重点] 1.IoC(Inversi ...
- Spring的IOC
引用:http://www.cnblogs.com/xdp-gacl/p/4249939.html 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念 ...
- Spring实现IoC的多种方式
目录 一.使用XML配置的方式实现IOC 二.使用Spring注解配置IOC 三.自动装配 四.零配置实现IOC 五.示例下载 控制反转IoC(Inversion of Control),是一种设计思 ...
- 框架学习之Spring(一IOC)----HelloWrod
一.概述 Spring是一个开源框架,它的核心是控制反转(IOC)和面向切面(AOP).简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架. EE 开发分 ...
随机推荐
- Java中布尔类型操作符&=,|=与^=的使用
今天在对同事的代码进行code review的时候,见到一个比较好玩的写法.“flag &= false:”,乍一看,还感觉他写错了,但是程序可以正常运行,赶紧去百度,看一下这个写法到底是怎么 ...
- Struts学习之自定义结果集
转自:http://blog.csdn.net/hanxuemin12345/article/details/38763057 项目中我们经常遇到这样的需求——页面部分刷新,例如:添加用户,转到添加用 ...
- Google地图,Baidu地图数据供应商
http://janwen.iteye.com/blog/488659 Google百度 我老以为百度,Google的地图产品是自己开发的,原来是别人提供的数据, 百度的数据提供商有 北京世纪高通科 ...
- win7 资源管理器的背景色修改
主要参考 http://blog.sina.com.cn/s/blog_49c182c20100w3nb.html win7 通过dll修改背景色首先找到这个文件C:\Windows\Resource ...
- web开发注意的一些事
js命名不要包含"-",在chrome浏览器是测试发现,如果文件包含"-",即使指定js本地缓存了,还会向服务器发送请求. cookie path 区分大小写
- PC游戏编程(入门篇)(前言写的很不错)
PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...
- POJ 2695 The Pilots Brothers' refrigerator(神奇的规律)
转载请注明出处:http://blog.csdn.net/a1dark 分析:如果想要将一个“+”翻转成“-”,那么必然会把对应的行和列上的所有点翻转一次.由于一个点翻偶数次就相当于不翻转.所以我需要 ...
- C# ikvm 运行htmlunit Provider com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl not found
在使用 ikvm 去运行 htmlunit 中的 webclient Getpage的时候 报错说com.sun.org.apache.xerces.internal.jaxp.DocumentBu ...
- c#语言基础之组成结构
一.项目结构 .cs--- 源文件(程序代码) .csproj---项目文件(管理文件项) .sln--- 解决方案文件(管理项目) .config---配置文件 函数的四要素:名称.输入. ...
- levelDB缓存实现
leveldb的缓存机制 leveldb采用LRU机制, 利用键的哈希值前n位作为索引, 将要插入的键值对分派到指定的缓存区, 当缓存区的使用率大于总容量后, 优先淘汰最近最少使用的缓存, 独立的缓存 ...