Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
◆轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
◆控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
◆面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
◆容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
◆框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
特点:
◆方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
◆AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
◆声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
◆方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。
◆方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
◆降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
◆Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
l Spring是一个轻量级的IoC和AOP的容器框架
- 轻量级:程序的实现不是很复杂,而且占用的资源比较少,非侵入式
- IoC (Inversion Of Control):控制反转, 对象如何得到它的协作对象的责任反转。
对象生命周期的管理
- AOP (Aspect Oriented Programming) 是一种编程的方式,可以更加容易地扩展系统的功能.
程序中重复代码问题,使得业务代码与非业务代码的解耦。
- 容器: 可以容纳对象,并且控制对象的生命周期
- 框架:将业务操作中一些重复性的, 通用性的代码进行了封装,搭建了一个除业务流程外的程序代码的架子,提高开发效率,将开发人员的开发重点放在业务上。减少一些其他共通性代码开发时发生错误的可能。
l Spring的系统架构
spring 7大组成模块:
1:spring core:提供了spring 的核心功能,BeanFactory是spring核心容器的主要组件,
它通过Ioc把程序的配置和依赖性与实际的代码分开,是整个spring的基础
2:spring context:通过配置文件向spring提供上下文信息,它构建在BeanFactory之上,另外增加了国际化和资源访问等功能
3: spring aop:提供了面向方面编程的功能
4: spring dao:提供了一个简单有效的JDBC应用
5:spring orm:spring除了有自己的JDBC以外还提供了对其他ORM框架的支持,如Hibernate; 都可以和spring进行良好的结合
6:spring web:提供了简化的处理多部分请求以及把请求参数绑定到域的任务。
7:spring MVC:提供了MVC2模式的实现,也可以和struts良好的集成在一起。
这七大模块可以单独使用,不需要其他模块的支持
l Spring的IoC
IoC称之为控制反转,从实现上分为2种
DI ( Dependency Injection ) 依赖注入
SL( Service Locator ) 服务定位器
- Spring使用DI方式实现控制反转。
- 依赖注入的方式,从实现上来将,分为3种
Interface Injection( 接口注入 ) 侵入性
l 容器运行时,目标对象实现特定的接口,然后容器通过接口将关联对象注入到目标对象中
Setter Injection( 属性set方法注入 )
l 容器运行时,通过类属性的set方法将关联对象注入到目标对象中
Constructor Injection( 构造方法注入 )
l 容器运行时,将关联对象通过目标对象的构造方法注入进去。
- Spring框架支持Stter注入,构造注入,不支持接口注入
- 为了简化开发人员的配置项目,可以使用自动装配功能
自动装配功能对于简单类型不起作用(字符串,基本类型,日期类型)
常用的自动装配类型
l byName
l byType
l default
- Spring框架管理对象的生命周期
构造方法
l BeanFactory(用到的时候)& ApplicationContext(解析配置文件的时候)
l 延迟加载(lazy-init)
l 创建对象的方式(单例创建,原型创建(多例创建))
初始化方法(init-method)
销毁方法(destroy-method)
Spring框架在web系统中的应用
监听器:在服务器启动时,读取配置文件,然后解析并创建核心对象,然后保存在application范围中。
Web应用的初始化参数
在程序中使用工具类直接获取spring框架的核心对象。
Spring框架在Struts2框架的集成
集成的插件jar包。
集成的方式:
l Action对象由Struts2框架创建,Service对象由Spring创建,自动装配方式采用struts2框架提供的。
l Action对象和Service对象都是由Spring框架创建。自动装配方式采用spring框架提供的。
l 对象工厂自己维护,那么需要设置拦截器,将关联对象组合到当前的业务对象中。
集成原理(重点)
Spring框架读取资源配置文件
在配置文件中可以使用类似于EL表达式的语法访问资源文件的内容。
Spring框架配置连接池
DBCP
C3P0
Spring框架和hibernate框架的集成
hibernate核心对象委托给Spring创建
DAO对象需要使用Spring提供的支持类。
- Spring框架和hibernate框架,Struts2框架的集成
l Spring的AOP
- 需要记住相关的术语
- Spring默认不支持AOP功能。所以如果使用,需要拷贝相关组件的jar包以及相关的配置
- 配置AOP功能,最重要的就是切入点表达式声明正确。
- AOP可以采用JDK的动态代理(基于接口)或CGLIB代理(基于继承)实现
- AOP配置事务,事务边界应该设置service层。
- 事务的AOP标签使用Spring自己提供的。
- 事务的传播行为和事务的隔离级别
- Spring框架事务的回滚策略为非受控异常。如果想要改变回滚策略,需要配置回滚的相关属性。
l Spring的注解
- 简化配置信息
- 如果需要使用注解,必须使用特定的标签。<context:component-scan base-package=""/>
通过扫描的方式查找所有增加了注解的类。
Spring框架提供了分层注解
控制层@Controller
服务层(逻辑层)@Service
持久层@Repository
自动装配(资源配置)@Resource
创建对象的方式@Scope("prototype ")
l Spring的总结
Spring的优点
轻量级的容器框架,没有侵入性
IOC更加容易组合对象之间的关系。
AOP可以更加容易的扩展业务的功能。遵循开发原则。
Spring能消除在许多工程中常见的对Singleton的过多使用。
Spring能消除各种各样自定义格式的属性文件的需要,使配置信息一元化。
Spring能够帮助我们真正意义上实现针对接口编程。
使用Spring构建的应用程序易于单元测试。
Spring支持JDBC和O/R Mapping产品(Hibernate)
Spring能使用AOP提供声明性事务管理。
提供了JavaMail或其他邮件系统的支持。
集成其他的不同Web框架。
Spring的缺点
简单的使用没有问题,但是在实际工作中,会增加业务操作的复杂度。
程序测试起来不容易。
业务功能依赖于Spring特有的功能,虽然从代码上没有侵入性,但是一旦脱离了Spring环境,业务无法执行。
l Spring的竞争者
- Google Guice (IOC)
- AspectJ (AOP)