1 Ioc是什么?

Ioc:Inversion of Control,控制反转,控制权从应用程序转移到框架(如Ioc容器),是框架的共有特性。

1.1 为什么需要IoC容器?IoC容器是如何演变的?

(1)、应用程序主动控制对象的实例化及依赖装配

a. 

  1. A a = new AImpl();
  2. B b = new BImpl();
  3. a.setB(b);

本质:创建对象,主动实例化,直接获取依赖,主动装配

缺点:更换实现需要重新编译源代码

   很难更换实现、难于测试

耦合实例生产者和实例消费者

b.

  1. A a = AFactory.createA();
  2. B b = BFactory.createB();
  3. a.setB(b);

本质:创建对象,被动实例化,间接获取依赖,主动装配 (简单工厂)

缺点:更换实现需要重新编译源代码 很难更换实现、难于测试

c.

  1. A a = Factory.create(“a”);
  2. B b = Factory.create(“b”);
  3. a.setB(b);
  1. <!—配置.properties-->
  2. a=AImpl
  3. b=BImpl

本质:创建对象,被动实例化,间接获取依赖, 主动装配 (工厂+反射+properties配置文件、 Service Locator、注册表)

缺点:冗余的依赖装配逻辑

(2)、可配置通用工厂工厂主动控制,应用程序被动接受,控制权从应用程序转移到工厂

  1. //返回装配好的a
  2. A a = Factory.create(“a”);
  1. <!—配置文件-->
  2. <bean id=“a” class=“AImpl”>
  3. <property name=“b” ref=“b”/>
  4. </bean>
  5. <bean id=“b” class=“BImpl”/>

本质:创建对象和装配对象,被动实例化,被动接受依赖,被动装配 (工厂+反射+xml配置文件)

缺点:不通用

步骤:

  a、读取配置文件根据配置文件通过反射 创建AImpl

  b、发现A需要一个类型为B的属性b

  c、到工厂中找名为b的对象,发现没有,读取 配置文件通过反射创建BImpl

  d、将b对象装配到a对象的b属性上

组件的配置与使用分离开(解耦、更改实现无需修改源代码、易于更好实现)

(3)、 IoC(控制反转)容器:容器主动控制

  1. //返回装配好的a
  2. A a = ApplicationContext.getBean(“a”);
  1. <!—配置文件-->
  2. <bean id=“a” class=“AImpl”>
  3. <property name=“b” ref=“b”/>
  4. </bean>
  5. <bean id=“b” class=“BImpl”/>

本质:创建对象和装配对象、管理对象生命周期 被动实例化,被动接受依赖,被动装配 (工厂+反射+xml配置文件)
通用

1.2 IoC容器的优点

【1】无需主动new对象;而是描述对象应该如何被创建即可

  IoC容器帮你创建,即被动实例化;

【2】不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),

IoC容器会帮你装配(即负责将它们关联在一起),被动接受装配

【3】主动变被动,好莱坞法则:别打电话给我们,我们会打给你;

【4】迪米特法则(最少知识原则):不知道依赖的具体实现,只知道需要提供 某类服务的对象(面向接口编程),松散耦合,一个对象应当对其他对象有尽 可能少的了解,不和陌生人(实现)说话

【5】IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式, 是一种减少类与类之间依赖的设计原则。

1.3 理解IoC容器问题关键(能干什么?)

(1)、谁控制谁?为什么叫反转?

IoC容器控制,而以前是应用程序控制,所以叫反转

(2)、控制什么?

控制应用程序所需要的资源(对象、文件……)

(3)、为什么控制?

解耦组件之间的关系

(4)、控制的哪些方面被反转了?

程序的控制权发生了反转:从应用程序转移到了 IoC容器。

1.4 主从换位的思想

思考: 1: IoC/DI等同于工厂吗? 2: IoC/DI跟以前的方式有什么不一样? 领会:主从换位的思想

1.5 实现了IoC思想的容器就是轻量级容器吗?

如果仅仅因为使用了控制反转就认为这些轻量级容器与众不同, 就好象在说我的轿车与众不同因为它有四个轮子?

IoC/DI是思想,不是技术。IoC是框架共性,只是控制权的转移,转移到框架,所以不能因为实现了IoC就叫IoC容器,而一般除来实现了IoC外,还具有DI功能的才叫IoC容器,因为容器还要负责装配组件关系,管理组件生命周期。

2 什么是DI?

DI:依赖注入(Dependency Injection) :用一个单独的对象(装配器)来 装配对象之间的依赖关系 。

2.1、为什么需要DI?

2.2、理解DI问题关键(能干什么)?

谁依赖于谁? 应用程序依赖于IoC容器。
为什么需要依赖? 应用程序依赖于IoC容器装配类之间的关系
依赖了什么东西? 依赖了IoC容器的装配功能
谁注入于谁? IoC容器注入应用程序
注入了什么东西? 注入应用程序需要的资源(类之间的关系)

更能描述容器其特点的名字——“依赖注入”(Dependency Injection)IoC容器应该具有依赖注入功能,因此也可以叫DI容器。

2.3、 IoC容器应具备DI功能才能算是容器?

IoC容器应该具有依赖注入功能,因此也可以叫DI容器

2.4、 DI优点

(1)帮你看清组件之间的依赖关系,只需要观察依赖注入的机制(setter/构造器),就可以掌握整个依赖(类与类之间的关系)。

(2)组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。

(3)依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不用关心具体的资源来自何处、由谁实现。

2.5、使用DI限制

组件和装配器(IoC容器)之间不会有依赖关系,因此组件无法从装配器那里获得更多服务,只能获得配置信息中所提供的那些。

2.6、依赖注入实现方式

(1)构造器注入

(2)Setter注入

(3)接口注入:在接口定义需要注入的信息,并通过接口完成注入

  1.     @Autowired
  2. public void prepare(MovieCatalog movieCatalog,
  3. CustomerPreferenceDao customerPreferenceDao) {
  4. this.movieCatalog = movieCatalog;
  5. this.customerPreferenceDao = customerPreferenceDao;
  6. }

2.7 使用IoC/DI容器开发需要改变的思路

(1)、应用程序不主动创建对象,但要描述创建它们的方式

(2)、在应用程序代码中不直接进行服务的装载,但要配置文件中描述哪一个组件需要哪一项服务。容器负责将这些装配在一起。

其原理是基于OO设计原则的The Hollywood Principle:Don't call us, We'll call you(别来找我,我会来找你)。也就是说,所有的组件都是被动的(Passive),所有的组件初始化和配置都由容器负责。组件处在容器当中,由容器负责管理。

IoC容器功能:实例化和初始化组件,装配组件关系、生命周期管理

本质:

  IoC:控制权的转移,由应用程序转移到框架;

  IoC/DI容器:由应用程序主动实例化对象变动等待对象(被动实例化);

  DI:由专门的装配器装配组件之间的关系;

  IoC/DI容器:由应用程序主动装配对象的依赖变应用程序被动接受依赖

注意:

 

Spring3开发(一)的更多相关文章

  1. 使用Maven搭建Struts2+Spring3+Hibernate4的整合开发环境

    做了三年多的JavaEE开发了,在平时的JavaEE开发中,为了能够用最快的速度开发项目,一般都会选择使用Struts2,SpringMVC,Spring,Hibernate,MyBatis这些开源框 ...

  2. Maven搭建Struts2+Spring3+Hibernate4框架

    做了三年多的JavaEE开发了,在平时的JavaEE开发中,为了能够用最快的速度开发项目,一般都会选择使用Struts2,SpringMVC,Spring,Hibernate,MyBatis这些开源框 ...

  3. JavaEE学习文章汇总-ssm框架

    Spring-SpringMVC-Mybatis 1:Maven创建webapp项目 Maven 下的spring框架(一创建项目) 2:mybatis3 入门教程 mybatis实战教程(mybat ...

  4. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  5. 【Hibernate】一级缓存

    一.概述 二.证明Hibernate的一级缓存的存在 三.一级缓存中快照区 四.管理一级缓存 五.Hibernate一级缓存的刷出时机 六.操作持久化对象的方法 一.概述 什么是缓存: 缓存将数据库/ ...

  6. Struts2+Spring3+Mybatis3开发环境搭建

    本文主要介绍Struts2+Spring3+Mybatis3开发环境搭建 Struts和Spring不过多介绍. MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBa ...

  7. 开发基础框架:mybatis-3.2.8 +hibernate4.0+spring3.0+struts2.3

    一:项目下载地址(点击 Source code(zip)) https://github.com/fzxblgong/frame_2014-12-15/releases 版本:v1.2大小:20M 二 ...

  8. Spring3.1中使用profile配置开发测试线上环境

    如果在开发时进行一些数据库测试,希望链接到一个测试的数据库,以避免对开发数据库的影响. 开发时的某些配置比如log4j日志的级别,和生产环境又有所区别. 各种此类的需求,让我希望有一个简单的切换开发环 ...

  9. Cxf + Spring3.0 入门开发WebService

    转自原文地址:http://sunny.blog.51cto.com/182601/625540/ 由于公司业务需求, 需要使用WebService技术对外提供服务,以前没有做过类似的项目,在网上搜寻 ...

随机推荐

  1. vmware linux nat模式设置静态ip

    网上资料很多,但是都不怎么实用,这里给大家总结一下.nat模式上网.因为nat本身就能上网为什么还要设置ip.这有点自找麻烦.但是在集群这是必须的.要么你搭建伪分布,要么至少具有三台物理机器.为了节省 ...

  2. Python 运行其他程序

    10.4 运行其他程序 在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程, ...

  3. java编程之POI读取excel表格的内容

    07版本的excel需要另外加一个jar包.xbean.jar的jar包 读取代码模板.利用模板介绍读取excel的一些poi的api这是重点 /** * 读取excel文件 * @Title: re ...

  4. 越来越不习惯客户端了,于是卸载了xmapp,重新配置了php+apache+mysql

    Mac os 10.10默认安装的是php 5.5.4版本 默认安装的apache是2.4.9 在mysql官网下载了5.7.11,此版本安装比较简单 比较郁闷的是sudo cp /etc/php.i ...

  5. Cannot read property 'setState' of undefined

    You're using function() in your Promise chain, this will change the scope for this. If you're using ...

  6. mac下导出JetBrains IDE Support插件给linux

    自从google被和谐以后,上google的store安装插件是如此的费劲,好在mac下的chrome已经装好了,直接导出给linux就可以 mac下chrome的插件目录为 ~/Library/Ap ...

  7. python学习(二十三) String(下) 分片和索引

    分片: 记住, 是开闭区间. a = "abcdef"print(a[:])print(a[1:])print(a[:3])print(a[-2])print(a[:-2])pri ...

  8. 安装NFS服务,并挂载到开发板

    1.前言 由于嵌入式linux开发大多数使用的是交叉编译环境,难免很频繁的将文件在开发板和PC环境之间传递,最方便的当然是网络传递了,可以使用FTP,以及挂载NFS两种方式了,显然后者更为方便了. 2 ...

  9. 【BZOJ】1912: [Apio2010]patrol 巡逻(树的直径)

    题目 传送门:QWQ 分析 $ k=1 $ 时显然就是树的直径 $ k=2 $ 时怎么做呢? 做法是把一开始树的直径上的边的边权改成$ -1 $,那么当我们第二次用这些边做环时就抵消了一开始的贡献. ...

  10. 使用国内源部署ceph

    由于网络方面的原因,Ceph的部署经常受到干扰,通常为了加速部署,基本上大家都是将Ceph的源同步到本地进行安装.根据Ceph中国社区的统计,当前已经有国内的网站定期将Ceph安装源同步,极大的方便了 ...