loC概述
loC(Inverse of Control,控制反转)是 Spring 容器的内核,AOP 、声明式事务等功能在此基础上开花结果。
loC 的字面意思是控制反转,它包括两方面的内容:一是控制,二是反转。那到底是什么东西的"控制"被"反转"了呢?对于软件来说,即某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定,即由Spring容器借由Bean配置来进行控制。
IoC 确实不够开门见山,因此业界曾进行了广泛的讨论。最终软件界的泰斗级人物 Martin Fowler 提出了 DI(Dependency Injec Iion ,依赖注入)的概念用来代替 IoC ,即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。"依赖注入"这个名词显然比"控制反转"直接明了、易于理解。
从注入方法上看,IoC 主要可以划分为3种类型:构造函数注入、属性注入和接口注入。Spring 支持构造函数注入和属性注入。
在程序领域可以通过第三方的容器帮助我们完成类的初始化与装配工作,让幵发者从这些底层实现类的实例化、依赖关系装配等工作中解脱出来,专注于更有意义的业务逻辑开发工作。这无疑是一件令人向往的事情。
Spring 就是这样的一个容器,它通过配罝文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入工作。
Spring配置概述
要使应用程序中的 Spring 容器成功启动,需要同时具备以下三方面的条件:
1、Spring 框架的类包都己经放到应用程序的类路径下。
2、应用程序为 Spring 提供了完备的 Bean 配罝信息。
3、Bean 的类都己经放到应用程序的类路径下。
Spring 启动时读取应用程序提供的 Bean 配置信息,并在 Spring 容器中生成一份相应的 Bean 配置注册表,然后根据这张注册表实例化 Bean ,装配好 Bean 之间的依赖关系,为上层应用提供准备就绪的运行环境。
Bean 配置信息是 Bean 的元数据信息,它由以下4个方面组成:
1、Bean 的实现类。
2、Bean 的属性信息,如数据源的连接数、用户名、密码等。
3、Bean 的依赖关系,Spring 根据依赖关系配置完成 Bean 之间的装配。
4、Bean 的行为配置,如生命周期范围及生命周期各过程的回调函数等。
Bean 元数据信息在 Spring 容器中的内部对应物是由一个个 BeanDefinition 形成的 Bean 注册表, Spring 实现了 Bean 元数据信息内部表示和外部定义的解耦。 Spring 支持多种形式的 Bean 配置方式。 Spring 1.0仅支持基于 XML 的配置。Spring 2.0新增基于注解配置的支持,Spring 3.0新增基于 Java 类配置的支持,而 Spring 4.0则新增基于 Groovy 动态语言配置的支持。
Spring 容器内部协作解构
Bean 配置信息首先定义了 Bean 的实现及依赖关系,Spring 容器根据各种形式的 Bean 配置信息在容器内部建立 Bean 定义注册表;然后根据注册表加载、实例化 Bean,并建立 Bean 和 Bean 之间的依赖关系;最后将这些准备就绪的 Bean 放到 Bean 缓存池中,以供外层的应用程序进行调用。