第九章 SpringIOC的概念
9.1 Spring的概括
-
Spring简介- 它的成功来自于理念,而不是技术,它最为核心的理念是
IoC(控制反转)和AOP(面向切面编程) - 其中
IoC是Spring的基础,而AOP则是其重要的功能,最为典型的当属数据库事务的使用 - 在
Spring中,它会认为一切Java类都是资源,而资源都是Bean,容纳这些Bean的是Spring所提供的IoC容器,所以Spring是一种基于Bean的编程
- 它的成功来自于理念,而不是技术,它最为核心的理念是
-
Spring的理念- 基于接口的编程是一种理念,强调
OOD的设计理念,比技术实现更为重要 Java开发的一大通病是大量使用try...catch...finally...,Spring尝试改善它们- 在当时的
Java技术中,很多框架都是侵略性的,也就是必须使用当前框架所提供的类库,才能实现功能,这样会造成应用对框架的依赖 Spring技术不是为了取代现有的技术,而是提供更好的整合模板使它们能够整合到Spring技术上来
- 基于接口的编程是一种理念,强调
-
Spring的策略- 对于
POJO的潜力开发,提供轻量级和低侵入的编程,可以通过配置(XML、注解等)来扩展POJO的功能,通过依赖注入的理念去扩展功能,建议通过接口编程,强调OOD的开发模式理念,降低系统稿合度,提高系统可读性和可扩展性。 - 提供切面编程,尤其是把企业的核心应用一一数据库应用,通过切面消除了以前复杂的
try... catch ... finally ...代码结构,使得开发人员能够把精力更加集中于业务开发而不是技术本身 - 为了整合各个框架和技术的应用,
Spring提供了模板类,通过模板可以整合各个框架和技术,比如支持Hibernate开发的Hibernate Template、支持MyBatis开发的SqlSessionTemplate、支持Redis开发的RedisTemplate等,这样就把各种企业用到的技术框架整合到Spring中,提供了统一的模板,从而使得各种技术用起来更简单。
2 SpringIoC 阐述
- 对于
-
控制反转:控制反转是一种通过描述(在
Java中可以是XML或者注解)并通过第三方去产生或获取特定对象的方式 -
IoC 容器
- 在
Spring中实现控制反转的是IoC容器,其实现的方式是依赖注入(Dependency Injection, DI) Spring会提供IoC容器来管理对应的资源,正如上面例子中的饮品店和订单资源,由它们产生依赖注入的关系
- 在
-
示例

-
对于交易开发人员:
- 当熟悉财务的同事完成对财务接口模块的开发,就可以将其服务发布到
Spring IoC的容器里, - 这个时候你只需要过程描述得到对应的财务接口,就可以完成对应的财务操作了,
- 而财务模块是如何工作的,它又需要依赖哪些对象,都是由熟悉财务模块的同事完成的,这些并不需要你去理解,你只需要知道它能完成对应的财务操作即可
- 当熟悉财务的同事完成对财务接口模块的开发,就可以将其服务发布到
-
对于测试人员
- 对于测试人员也一样,也许他早早把财务模块测试好了,需要测试交易模块
- 他并不希望非常细致地了解交易模块,他只需要从
Spring IoC容器中获取就可以了。而他的测试代码也只需要从Spring IoC容器获取交易模块的内容,至于内部复杂的依赖并不是他所需要关注的内容 - 这样就有利于测试人员对模块的测试,降低测试人员测试的复杂度
-
总结: 降低开发难度,对模块解耦,同时更利于测试
9.3 Spring IoC 容器
- Spring IoC容器的作用是容纳我们所开发的各种Bean,并且我们可以从中获取各种发布在Spring IoC容器里的Bean,并且通过描述可以得到它
9.3.1 Spring IoC 容器的设计
-
Spring IoC 接口设计
- Spring IoC 容器的设计主要基于
BeanFactory和ApplicationContext两个接口 BeanFactory是Spring IoC容器所定义的最底层的接口ApplicationContext是高级接口之一,并且对BeanFactory的功能做了许多有用的扩展- Spring IoC 容器接口类图

- Spring IoC 容器的设计主要基于
-
BeanFactory接口解读getBean的多个方法用来获取配置给Spring IoC容器的BeanisSingleton用来判断是否单例,如果判断为真,其意思是该Bean在容器中是作为唯一单例存在的isPrototype如果判断为真,意思是当你从容器中获取Bean,容器就为你生成一个新的实例type是一个按照java类型匹配的方法getAliases方法是获取别名的方法
9.3.2 Spring IoC容器的初始化和依赖注入
-
Bean的定义步骤Resource定位BeanDefinition的载入BeanDefinition的注册
-
依赖注入:
- 依赖注入的观念就是将所有东西先在"外面"准备好,然后再带入“内部”的程式中,如此一来你就能够在检视程式码的时候,一目了然地知道这个程式依赖著哪些类别。
- 通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
- 技术描述:
Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定。
9.3.3 Spring Bean 的生命周期
-
Bean在容器中存在其生命周期,它的初始化和销毁也需要一个过程,在一些需要自定义的过程中,我们可以插入代码来改变它们的一些行为 -
Bean的生命周期
