IOC控制反转详解_第1页
IOC控制反转详解_第2页
IOC控制反转详解_第3页
IOC控制反转详解_第4页
IOC控制反转详解_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

IOC 控制反转详控制反转详解解 本文转载与百度知道 简单例子让初学者很快对 IoC 有一个全面的了解 首先想说说 IoC Inversion of Control 控制倒转 这是 spring 的核心 贯穿始终 所 谓 IoC 对于 spring 框架来说 就是由 spring 来负责控制对象的生命周期和对象间的关系 这是什么意思呢 举个简单的例子 我们是如何找女朋友的 常见的情况是 我们到处去看哪 里有长得漂亮身材又好的 mm 然后打听她们的兴趣爱好 qq 号 电话号 ip 号 iq 号 想办法认识她们 投其所好送其所要 然后嘿嘿 这个过程是复杂深奥的 我们必 须自己设计和面对每个环节 传统的程序开发也是如此 在一个对象中 如果要使用另外的对 象 就必须得到它 自己 new 一个 或者从 JNDI 中查询一个 使用完之后还要将对象销毁 比如 Connection 等 对象始终会和其他的接口或类藕合起来 那么 IoC 是如何做的呢 有点像通过婚介找女朋友 在我和女朋友之间引入了一个第三者 婚姻介绍所 婚介管理了很多男男女女的资料 我可以向婚介提出一个列表 告诉它我想找个 什么样的女朋友 比如长得像李嘉欣 身材像林熙雷 唱歌像周杰伦 速度像卡洛斯 技术像 齐达内之类的 然后婚介就会按照我们的要求 提供一个 mm 我们只需要去和她谈恋爱 结 婚就行了 简单明了 如果婚介给我们的人选不符合要求 我们就会抛出异常 整个过程不再 由我自己控制 而是有婚介这样一个类似容器的机构来控制 Spring 所倡导的开发方式就是如 此 所有的类都会在 spring 容器中登记 告诉 spring 你是个什么东西 你需要什么东西 然 后 spring 会在系统运行到适当的时候 把你要的东西主动给你 同时也把你交给其他需要你 的东西 所有的类的创建 销毁都由 spring 来控制 也就是说控制对象生存周期的不再是引 用它的对象 而是 spring 对于某个具体的对象而言 以前是它控制其他对象 现在是所有对 象都被 spring 控制 所以这叫控制反转 IoC 的一个重点是在系统运行中 动态的向某个对 象提供它所需要的其他对象 这一点是通过 DI Dependency Injection 依赖注入 来实现 的 比如对象 A 需要操作数据库 以前我们总是要在 A 中自己编写代码来获得一个 Connection 对象 有了 spring 我们就只需要告诉 spring A 中需要一个 Connection 至 于这个 Connection 怎么构造 何时构造 A 不需要知道 在系统运行时 spring 会在适当的 时候制造一个 Connection 然后像打针一样 注射到 A 当中 这样就完成了对各个对象之间 关系的控制 A 需要依赖 Connection 才能正常运行 而这个 Connection 是由 spring 注入 到 A 中的 依赖注入的名字就这么来的 那么 DI 是如何实现的呢 Java 1 3 之后一个重要 特征是反射 reflection 它允许程序在运行的时候动态的生成对象 执行对象的方法 改 变对象的属性 spring 就是通过反射来实现注入的 关于反射的相关资料请查阅 java doc 理解了 IoC 和 DI 的概念后 一切都将变得简单明了 剩下的工作只是在 spring 的框架中堆 积木而已 下面来让大家了解一下 Spring 到底是怎么运行的 Java 代码 public static void main String args ApplicationContext context new FileSystemXmlApplicationContext applicationContext xml Animal animal Animal context getBean animal animal say 这段代码你一定很熟悉吧 不过还是让我们分析一下它吧 首先是 applicationContext xml Java 代码 他有一个类 phz springframework test Cat Java 代码 public class Cat implements Animal private String name public void say System out println I am name public void setName String name this name name 实现了 phz springframework test Animal 接口 Java 代码 public interface Animal public void say public interface Animal public void say 很明显上面的代码输出 I am kitty 那么到底 Spring 是如何做到的呢 接下来就让我们自己写个 Spring 来看看 Spring 到底是怎么运行的吧 首先 我们定义一个 Bean 类 这个类用来存放一个 Bean 拥有的属性 Java 代码 Bean Id private String id Bean Class private String type Bean Property private Map properties new HashMap 一个 Bean 包括 id type 和 Properties 接下来 Spring 就开始加载我们的配置文件了 将我们配置的信息保存在一个 HashMap 中 HashMap 的 key 就是 Bean 的 Id HasMap 的 value 是这个 Bean 只有这样我们才能 通过 context getBean animal 这个方法获得 Animal 这个类 我们都知道 Spirng 可以 注入基本类型 而且可以注入像 List Map 这样的类型 接下来就让我们以 Map 为例看看 Spring 是怎么保存的吧 Map 配置可以像下面的 Java 代码 1 2 Spring 是怎样保存上面的配置呢 代码如下 Java 代码 if beanProperty element map null Map propertiesMap new HashMap Element propertiesListMap Element beanProperty elements get 0 Iterator propertiesIterator propertiesListMap elements iterator while propertiesIterator hasNext Element vet Element propertiesIterator next if vet getName equals entry String key vet attributeValue key Iterator valuesIterator vet elements iterator while valuesIterator hasNext Element value Element valuesIterator next if value getName equals value propertiesMap put key value getText if value getName equals ref propertiesMap put key new String value attributeValue bean bean getProperties put name propertiesMap 接下来就进入最核心部分了 让我们看看 Spring 到底是怎么依赖注入的吧 其实依赖注入的 思想也很简单 它是通过反射机制实现的 在实例化一个类时 它通过反射调用类中 set 方法 将事先保存在 HashMap 中的类属性注入到类中 让我们看看具体它是怎么做的吧 首先实例化一个类 像这样 Java 代码 public static Object newInstance String className Class cls null Object obj null try cls Class forName className obj cls newInstance catch ClassNotFoundException e throw new RuntimeException e catch InstantiationException e throw new RuntimeException e catch IllegalAccessException e throw new RuntimeException e return obj 接着它将这个类的依赖注入进去 像这样 Java 代码 public static void setProperty Object obj String name String value Class clazz obj getClass try String methodName returnSetMthodName name Method ms clazz getMethods for Method m ms if m getName equals methodName if m getParameterTypes length 1 Class clazzParameterType m getParameterTypes 0 setFieldValue clazzParameterType getName value m obj break catch SecurityException e throw new RuntimeException e catch IllegalArgumentException e throw new RuntimeException e catch IllegalAccessException e throw new RuntimeException e catch InvocationTargetException e throw new RuntimeException e 最后它将这个类的实例返回给我们 我们就可以用了 我们还是以 Map 为例看看它是怎么做 的 我写的代码里面是创建一个 HashMap 并把该 HashMap 注入到需要注入的类中 像这样 Java 代码 if value instanceof Map Iterator entryIterator Map value entrySet iterator Map map new HashMap while entryIterator hasNext Entry entryMap Entry entryIterator next i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论