第一章 Spring 基础介绍
一.Spring 体系介绍
Spring的功能和特点大致上被组织成如下7个部分:
核心机制
Context容器
Web支持
MVC框架
DAO支持
ORM支持
AOP(面向切面编程)支持
核心机制以BeanFactory为基础,管理Bean与Bean之间的依赖。ApplicationContext(应用程序上下文)容器是BeanFactory功能加强的子接口。Web支持提供Web应用开发的支持。MVC框架则针对Web应用的MVC思想实现,DAO支持包括一致的异常处理和编程方式,ORM支持则用于与流行的ORM框架的整合,AOP提供与AOP联盟兼容的编程实现。
1.Spring的核心和Context(上下文)
Spring以bean(这里的bean是广义的JavaBean)的方式组织、管理Java应用中各组件,组件之间的依赖关系松耦合运行良好。这都得益于Spring的核心机制:依赖注入(DI)。Spring使用BeanFactory作为应用中负责生产和管理各组件的工厂,同时也是组件运行的容器。BeanFactory根据配置文件确定容器中Bean的实现,管理Bean之间的依赖关系。
Bean之间的依赖关系由BeanFactory管理,bean的具体实例化过程也由BeanFactory来管理。将Bean对Bean实现类的依赖解耦,变成面向接口的依赖。程序也就从面向具体类的编程改为编写接口编程。极大的降低应用中组件的耦合。
2.Spring的Web和MVC
Spring的Web框架围绕分发器(DispatcherServlet)设计,DispatcherServlet将请求分发到不同的处理器。Spring的MVC框架提供清晰的角色划分:控制器、验证器、命令对象、表单对象和模型对象、分发器处理映射和视图解析器。支持多种表现层技术。
3.AOP编程
AOP完善Spring的DI。主要表现为:
AOP提供声明式事务管理
支持用户自定义切面
二.Spring的基本设计思想
Spring实现了两种基本设计模式:
单态模式
工厂模式
Spring容器是实例化和管理全部bean的工厂,工厂模式可将Java对象的调用者从被调用者的实现逻辑分离出来,调用者只需知道被调用者必须满足某种规则(接口),而不必关心实例的具体实现过程,具体的实现由bean工厂完成。也就是说所有的bean通过配置文件进行管理,调用者只需知道被调用者在配置文件中的名称,被调用者的实例化过程全部都有spring容器来完成。工厂无须多个实例,所以工厂应该采取单态模式。Spring上下文,也就是产生bean实例的工程,也被设计成单态模式。Spring实现的工厂模式,不仅提供创建bean的功能,还提供对bean生命周期的管理。同时还可以管理bean与bean之间的依赖关系,以及bean的属性值。
Spring默认将所有的bean设置成单态模式,即在配置文件中对所有相同id的bean的请求,都将返回同一个共享实例。单态模式可大大降低Java对象创建和销毁时的系统开销。使用Spring将bean设成单态行为,则无须自己完成单态模式。
三.Spring的核心机制(DI、IOC)
依赖注入让bean与bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。
1.基本概念
DI(依赖注入)与IOC(控制反转)是同一个概念,具体解释如下:
当某个角色(调用者)需要另一个角色(被调用者)的协助时,在传统的程序设计过程中,通常是在调用者中创建被调用者(通过new一个被调用者实例的方式),但在Spring中,创建被调用者的工作不再由调用者来完成了,而是将创建的工作交由Spring容器来完成,因此成为控制反转(IOC);Spring创建完被调用者实例后,将被调用者的实例注入到调用者,因此也称为依赖注入(DI),也就是说在程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外包的注入。
依赖注入通常分为两种:设值注入、构造注入
2.设值注入
在调用者中通过setter方法传入被调用者的实例。
通常是通过在配置文件中添加<property>与<ref>子标签完成。
例如:
<bean id="tbnsEngineeringRepairDao" class="com.inspur.app.engineeringRepair.dao.TbnsEngineeringRepairDAO">
<property name="sessionFactory"><ref bean="es_sessionFactory"/></property>
</bean>
从上面的配置文件(片段)中可以简单的看到bean与bean之间的依赖关系放在配置文件里组织,而不是写在代码里。通过配置文件的指定,Spring能够精确的为每个bean注入属性。配置文件里的bean的class元素,不能仅仅是接口,而是应该是具体的实现类。
Spring会自动接管每个bean定义里的property元素定义。Spring会在执行无参的构造器和创建默认的bean实例后,调用对应的setter方法为程序注入属性值。property定义的属性值将不再由该bean来自动创建、管理,而改为被动接受spring的注入。
3.构造注入
通过构造函数来完成依赖关系的设定,而不是通过setter方法。
通常是通过在配置文件中添加<constructor-arg>与<ref>子标签完成。
例如:
<bean id="tbnsEngineeringRepairDao" class="com.findpather.app.engineeringRepair.dao.TbnsEngineeringRepairDAO">
<constructor-arg><ref bean="es_sessionFactory"/></constructor-arg>
</bean>
4.两者区别
创建被调用者的时机不同:
设值注入是先创建一个默认的bean实例,然后调用对应的setter方法注入依赖关系。
构造注入则在创建bean实例时,已经完成依赖关系的注入。