• Spring (一) IOC ( Inversion Of Control )


    1. 前序
      1. 现在小米手机很火就还拿小米手机来举例子,上一篇写的关于SSH框架搭建是从小米手机公司内个整个流程方面来考虑,如何提高效率生产效率,这篇博客主要从公司外部环境说明如何提高生产效率,那么怎么才能提高呢?
      1. 这就需要找专业的厂商来管理某一部分的生产,代替自己生产,就好比利用SpringIOC容器来管理对象的创建一样,而不是在程序里面代码进行创建,让我们来看一下官方丁描述。
      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类,又提供了FieldMethodContructor等类,它们的对象分别对应指定到那个类的属性、方法、构造函数,如此一来通过一个超类Class即可拿取到所有类的所有信息,反射的最基础原理就是这样实现的,更详细讲解请点击这里:Class类与Java反射详解。
    1. Spring物料管理实例
      1. 我们仅仅截取物料例子中的业务逻辑层调用Dao部分代码拿过来看一看,是如何利用IOC容器来管理的。
      1. 实现之前代码
        1. 物料业务类
        1. 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;
          	}
          }

      1. IOC管理后
        1. 物料业务类
        2. 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("添加物料失败!");
          		}
          	}
          	
          }

        3. 配置文件
        4. <?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>

      1. 前后代码减少了直接访问Dao层的代码,减少了耦合性,也提高了很多效率,在程序加载的时候就可以把该注入的类都进行注入,不用去等着实例化哪一个类了。
    1. 小结
      1. 使用IOC进行开发目前很流行,主要原因是因为它很灵活,给开发带来了方便越来越受到程序员的青睐,这里仅仅是一点基础性总结,更深入的理解还需要在实践中慢慢锻炼!
  • 相关阅读:
    Using Change Management and Change Control Within a Project
    swift3.0 label改变行间距
    swift清理缓存
    Alamofire的get请求,post请求,以及上传字典
    swift跳转时隐藏tabbar,跳回时显示
    swift获取当前的Version
    swift回收键盘
    OC中常用的设计模式
    关于iOS多线程
    理解 : UDID、UUID、IDFA、IDFV
  • 原文地址:https://www.cnblogs.com/pangblog/p/3320324.html
Copyright © 2020-2023  润新知