Spring培训2011年11月Spring框架总结构Spring历史Spring介绍Spring框架核心技术Spring七大模块简介Spring术语简介控制反转的定义依赖注入的原理容器管理Spring中获取数据库连接方式Spring事务管理JSF集成SpringSpring集成Ibatis本次培训内容Spring历史Spring出自于RodJohnson的大作,源于他在2002年所著ExpertOne-on-OneJ2EEDesignandDevelopment一书的基础代码。2003年2月,他把所描述的框架在SourceForge.net公开了源码,后来这个框架就成为今天我们所学习的著名框架Spring。Spring简介Spring是一种多层的J2EE应用程序框架,其核心就是提供一种新的机制管理业务对象及其依赖关系。例如IOC(控制反转),AOP(面向切面编程)详细介绍站点整体架构spring整体架构Core封装包是框架的最基础部分,提供IoC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。Dao提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plainoldJavaobjects)都适用。spring整体架构ORM封装包提供了常用的“对象/关系”映射APIs的集成层。其中包括JPA、JDO、Hibernate和iBatis。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。Spring的AOP封装包提供了符合AOPAlliance规范的面向方面的编程(aspect-orientedprogramming)实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中,这有点象.Net的attribute的概念。spring整体架构Spring中的Web包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servletlisteners进行IoC容器初始化和针对Web的applicationcontext。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和webform之间。并且,还可以借助Spring框架的其他特性。Spring中的术语介绍轻量级非入侵式容器IOC/DIAOP持久层WEB框架体系与其它框架的无缝结合术语-轻量级轻量级是针对重量级(EJB)来说的,Spring的核心包不到1M大小,而使用Spring的核心包所需的资源也很小,所以可以在小型设备中使用。术语-入侵性所有的框架都是提供大量的功能供用户去使用,从而简化开发时间和成本,但由于大量的使用了框架的API,使应用程序和框架发生了大量的依赖性,无法从框架中独立出来,更加无法使程序组件在其他程序中使用,而Spring目标是一个非入侵式的服务框架。术语-持久层的支持Spring提供了对持久层的整合,对JDBC的使用加以封装简化,提供事务功能,对ORM框架封装,并提供更简单的接口。术语-Spring中的IOCIOC:InversionofControl,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。什么意思呢?就好比一个皇帝和太监有一天皇帝想宠幸某个美女,于是跟太监说,今夜我要宠幸美女,皇帝往往不会告诉太监,今晚几点会回宫,会回哪张龙床,他只会告诉太监他要哪位美女其它一切都交由太监去安排,到了晚上皇帝回宫时,自然会有美女出现在皇帝的龙床上,这就是控制反转;而把美女送到皇帝的寝宫里面去就是注射,太监就是框架里面的注射控制器类BeanFactory,负责找到美女并送到龙床上去;整个后宫可以看成是Spring框架,美女就是Spring控制下的JavaBean。IOC原理发展过程一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。原始社会里,几乎没有社会分工。需要斧子的人(调用者)只能自己去磨一把斧子(被调用者)。对应的情形为:Java程序里的调用者自己创建被调用者。进入工业社会,工厂出现。斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。对应Java程序的简单工厂的设计模式。进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子。斧子就自然出现在他面前。对应Spring的依赖注入。术语-Spring中的DIDI:DependencyInjection依赖注入DI和IOC是同一个概念。具体含义是:当某个角色需要另一个角色的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入给调用者,因此也称为依赖注入。依赖注入的三种方式接口注入publicclassMyServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{……}}HttpServletRequest和HttpServletResponse实例由ServletContainer在运行期动态注入。依赖注入的三种方式设值注入设值注入是指通过setter方法传入被调用者的实例。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。构造注入构造注入,指通过构造函数来完成依赖关系的设定,而不是通过setter方法来完成被调用者实例的注入依赖注入的三种方式接口注入模式因为历史较为悠久,在很多容器中都已经得到应用。但由于其在灵活性、易用性上不如其他两种注入模式,因而在IOC的专题世界内并不被看好。构造注入和设值注入模式各有千秋,理论上,以构造注入类型为主,辅之以设值注入类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于SpringFramework开发的应用而言,设值注入使用更加广泛。术语-Spring中的AOPSpring最被人重视的另一个方面就是对AOP的支持,其实AOP只是Spring支持的一个子容器。AOPAspectedOrientedProgramming面身向方面编程。它可以解决OOP和过程化方法不能够很好解决的横切(crosscut)问题,如:事务、安全、日志等。SpringAOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。建议优先使用JDK的动态代理,强制使用CGLIB代理需要将aop:config的proxy-target-class属性设为true。术语-容器-Bean的管理BeanFactory,ApplicationContextBeanFactory负责读取Bean的定义、管理对象的加载、生成、维护Bean和Bean之间的依赖关系。而ApplicationContext提供了一些特色和更高级的服务。如:读取ResourceFile更加方便国际化的支持支持文字消息解析术语-容器Bean的生命周期Bean的建立Bean的初始化Bean的使用(属性注入)Bean的销毁Spring中获取连接方式11:DBCP数据源DBCP类包位于SPRING_HOME/lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖Jakartacommons-pool对象池机制的数据库连接池,所以在类路径下还必须包括SPRING_HOME/lib/jakarta-commons/commons-pool.jar。下面是使用DBCP配置oracle数据源的配置片断:beanid=dataSourceclass=org.apache.commons.dbcp.BasicDataSourcedestroy-method=closepropertyname=driverClassNamevalue=oracle.jdbc.driver.OracleDriver/propertyname=urlvalue=jdbc:oracle:thin:@localhost:1521:orcl/propertyname=usernamevalue=root/propertyname=passwordvalue=1234/注意:DBCP数据源是tomcat连接池默认的实现方式Spring中获取连接方式22:C3P0数据源C3P0是一个开放源代码的JDBC数据源实现项目,它在lib目录中与Hibernate一起发布,实现了JDBC3和JDBC2扩展规范说明的Connection和Statement池。C3P0类包位于SPRING_HOME/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一个Oracle数据源:beanid=dataSourceclass=com.mchange.v2.c3p0.ComboPooledDataSourcedestroy-method=closepropertyname=driverClassNamevalue=oracle.jdbc.driver.OracleDriver/propertyname=urlvalue=jdbc:oracle:thin:@localhost:1521:orcl/propertyname=usernamevalue=root/propertyname=passwordvalue=1234/注:Hibernate中已经放弃了对DBCP的支持,取而代之的是C3P0数据源Spring中获取连接方式33.Spring的数据源实现类(DriverManagerDataSource)Spring本身也提供了一个简单的数据源实现类DriverManagerDataSource,它位于org.springframework.jdbc.datasource包中。这个类实现了javax.sql.DataSource接口,但它并没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接。因此,这个数据源类比较适合在单元测试或简单的独立应用中使用,因为它不需要额外的依赖类。Spring中获取连接方式3beanid=dataSourceclass=org.springframework.jdbc.datasource.DriverManagerDataSourcedestroy-method=closepropertyname=driverClassNamevalue=oracle.jdbc.driver.OracleDriver/propertyname=urlvalue=jdbc:oracle:thin:@localhost:1521:orcl/