1. 前序
    1. 现在小米手机很火就还拿小米手机来举例子,上一篇写的关于SSH框架搭建是从小米手机公司内个整个流程方面来考虑,如何提高效率生产效率,这篇博客主要从公司外部环境说明如何提高生产效率,那么怎么才能提高呢?
    1. 这就需要找专业的厂商来管理某一部分的生产,代替自己生产,就好比利用Spring的IOC容器来管理对象的创建一样,而不是在程序里面代码进行创建,让我们来看一下官方丁描述。
    1. 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
    1. 实现IOC的框架并不是只有一种Spring,还有EJB3.0、Apache Avalon等都实现了这种功能,这里我们只看一下Spring是怎么来实现的。
  1. 实现原理
    1. 实现IOC有两种方式分别为DI(Dependency Injection)和DL(Dependency Lookup)。如下图
    1. 依赖查找(DL)
      1. 容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。
    1. 依赖注入(DI)
      1. 组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。大家常用的就是这种方式啦,记得看视频的时候常常提及DI依赖注入,除了我们知道的构造函数、Setter()两种注入方法,还有一种是Interface注入,当然我们最最常用的还是Setter注入了。
    1. 依赖注入之所以更流行是因为它是一种更可取的方式:让容器全权负责依赖查询,受管组件只需要暴露JavaBean的setter方法或者带参数的构造子或者接口,使容器可以在初始化时组装对象的依赖关系。其与依赖查找方式相比,主要优势为:
      1. 查找定位操作与应用代码完全无关。
      2. 不依赖于容器的API,可以很容易地在任何容器以外使用应用对象。
      3. 不需要特殊的接口,绝大多数对象可以做到完全不必依赖容器。
    1. 如果你还想知道IOC是怎么样注入、实例化对象的,你需要研究一下Java反射机制,IOC是利用配置文件来定位、实例化对象滴,用配置文件实例化就会用到反射技术,简单说一下思路。
      1. 在Java中有一个特殊Class可以定位所有class类,又提供了Field、Method、Contructor等类,它们的对象分别对应指定到那个类的属性、方法、构造函数,如此一来通过一个超类Class即可拿取到所有类的所有信息,反射的最基础原理就是这样实现的,更详细讲解请点击这里:Class类与Java反射详解。
  1. Spring物料管理实例
    1. 我们仅仅截取物料例子中的业务逻辑层调用Dao部分代码拿过来看一看,是如何利用IOC容器来管理的。
    1. 实现之前代码
      1. 物料业务类
        1. package com.bjpowernode.drp.service;
        2.  
        3. import com.bjpowernode.drp.AppException;
        4. import com.bjpowernode.drp.BeanFactory;
        5. import com.bjpowernode.drp.DBUtil;
        6. import com.bjpowernode.drp.PageModel;
        7. import com.bjpowernode.drp.dao.ItemDao;
        8. import com.bjpowernode.drp.domain.Item;
        9.  
        10. /**
        11. * IOC
        12. * @author Administrator
        13. *
        14. */
        15. public class ItemServiceImpl implements ItemService {
        16.  
        17. public void addItem(Item item) {
        18.  
        19. try {
        20. itemDao.addItem(item);
        21. } catch (Exception e) {
        22. e.printStackTrace();
        23. throw new AppException("添加物料失败!");
        24. }
        25.  
        26. }
        27.  
        28. private ItemDao getItemDao() {
        29. ItemDao itemDao = (ItemDao)BeanFactory.getInstance().getBean(ItemDao.class);
        30. return itemDao;
        31. }
        32. }
    1. IOC管理后
      1. 物料业务类
        1. package com.bjpowernode.drp.service;
        2.  
        3. import com.bjpowernode.drp.AppException;
        4. import com.bjpowernode.drp.PageModel;
        5. import com.bjpowernode.drp.dao.ItemDao;
        6. import com.bjpowernode.drp.domain.Item;
        7.  
        8. /**
        9. * IOC
        10. * @author Administrator
        11. *
        12. */
        13. public class ItemServiceImpl implements ItemService {
        14.  
        15. private ItemDao itemDao;
        16.  
        17. public void setItemDao(ItemDao itemDao) {
        18. this.itemDao = itemDao;
        19. }
        20.  
        21. public void addItem(Item item) {
        22.  
        23. try {
        24. itemDao.addItem(item);
        25. } catch (Exception e) {
        26. e.printStackTrace();
        27. throw new AppException("添加物料失败!");
        28. }
        29. }
        30.  
        31. }
      2. 配置文件
        1. <?xml version="1.0" encoding="UTF-8"?>
        2.  
        3. <!--
        4. - Application context definition for JPetStore's business layer.
        5. - Contains bean references to the transaction manager and to the DAOs in
        6. - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
        7. -->
        8. <beans xmlns="http://www.springframework.org/schema/beans"
        9. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        10. xmlns:aop="http://www.springframework.org/schema/aop"
        11. xmlns:tx="http://www.springframework.org/schema/tx"
        12. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        13. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
        14. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
        15.  
        16. <!-- 配置Service里面的itemDao,dataDictService -->
        17. <bean id="itemService" class="com.bjpowernode.drp.service.ItemServiceImpl">
        18. <property name="itemDao" ref="itemDao"></property>
        19. </bean>
        20.  
        21. <bean id="dataDictService" class="com.bjpowernode.drp.service.DataDictServiceImpl">
        22. <property name="dataDictDao" ref="dataDictDao"></property>
        23. </bean>
        24.  
        25. </beans>
    1. 前后代码减少了直接访问Dao层的代码,减少了耦合性,也提高了很多效率,在程序加载的时候就可以把该注入的类都进行注入,不用去等着实例化哪一个类了。
  1. 小结
    1. 使用IOC进行开发目前很流行,主要原因是因为它很灵活,给开发带来了方便越来越受到程序员的青睐,这里仅仅是一点基础性总结,更深入的理解还需要在实践中慢慢锻炼!

Spring (一) IOC ( Inversion Of Control )的更多相关文章

  1. 【Java_Spring】控制反转IOC(Inversion of Control)

    1. IOC的概念 控制反转IoC(Inversion of Control)是一种设计思想,而DI(依赖注入)是实现IoC的一种方法.在没有使用IOC的程序中,对象间的依赖关系是靠硬编码的方式实现的 ...

  2. Spring基础[IOC/DI、AOP]

    一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被 ...

  3. Spring实现IOC

    目录 一.使用XML配置的方式实现IOC 二.使用Spring注解配置IOC 三.自动装配 四.零配置实现IOC 五.示例下载 控制反转IoC(Inversion of Control),是一种设计思 ...

  4. Spring学习总结(一)——Spring实现IoC的多种方式

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...

  5. Spring之IoC总结帖

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development a ...

  6. 关于Spring的IOC和DI

    原始调用模型 Spring的演化过程 Spring的调用过程 ======================================= IoC[理解][应用][重点] 1.IoC(Inversi ...

  7. Spring的IOC

    引用:http://www.cnblogs.com/xdp-gacl/p/4249939.html 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念 ...

  8. Spring实现IoC的多种方式

    目录 一.使用XML配置的方式实现IOC 二.使用Spring注解配置IOC 三.自动装配 四.零配置实现IOC 五.示例下载 控制反转IoC(Inversion of Control),是一种设计思 ...

  9. 框架学习之Spring(一IOC)----HelloWrod

    一.概述 Spring是一个开源框架,它的核心是控制反转(IOC)和面向切面(AOP).简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架. EE 开发分 ...

随机推荐

  1. 面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

    题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输 ...

  2. 空类的默认函数—— SAP电面(2)/FEI

    定义一个空类 class Empty { }; 默认会生成以下几个函数 2. 拷贝构造函数 Empty(const Empty& copy) { } 3. 赋值运算符 Empty& o ...

  3. ThinkPHP第十四天(显示TRACE界面配置,关联模型详解定义)

    1.显示TRACE界面,首选需要在显示模版界面,$this->display(),然后需要在配置文件中配置 SHOW_PAGE_TRACE => true 2.关联模型使用 主表以user ...

  4. RAW模板开发--入口文件官方规范

    每个人都有自己的习惯,为了RAW模板能进一步推广,使RAW模板的开发也更有条理,所以写了这个文章. 规范1格式: <?php /*RAW标记声明-start*/ /*RAW标记声明-over*/ ...

  5. Python 第三篇(上):python文件基础操作、json模块、lambda、map、filter、reduce和函数位置参数

    python一切皆对象,linux一切皆文件,python操作文件是很常见的O/I操作,其内置来open()函数可以完成文件的基本操作: 一:使用内置open()函数操作文件,基本语法如下: with ...

  6. 用PyRestful快速构建Tornado下REST APIs 的支持

    一.安装PyRestful库 $ pip install pyrestful 二.使用案例 (一)books_service.py # -*- coding: utf-8 -*- import tor ...

  7. Qt在Linux环境下应用程序字体模糊的解决方法(先改成使用默认字体,然后使用qtconfig配置)

    这两天一直在用Qt实现一个跨平台的软件.软件之前在Windows上编写的,后来放到里Ubuntu 10.10下编译.程序运行时遇到一个很棘手的问题,界面文本非常模糊.后来在网上查阅了好几天的资料,经历 ...

  8. Hibernate 知识点复习

    核心接口 1  Configuration接口负责配置并启动Hibernate,创建SessionFactory对象 2  SessionFactory接口负责初始化Hibernate.它充当数据存储 ...

  9. BZOJ 3389: [Usaco2004 Dec]Cleaning Shifts安排值班

    题目 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MB Description      ...

  10. 在LINUX的命令提示符及CMD命令提示符中显示时间

    用途之一是可以查看某个命令或程序的执行时间. 一.CMD中显示时间设置 参数说明: $P:当前路径 $G:>(大于号) $T:当前时间,精确到0.01s 实验如下: C:\Users\g4-10 ...