Spring学习总结.docx_第1页
Spring学习总结.docx_第2页
Spring学习总结.docx_第3页
Spring学习总结.docx_第4页
Spring学习总结.docx_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前边讲述了用于处理数据流程的Struts2的框架,和用于操作数据的IBatis持久层框架,这篇博客开始总结一下Spring框架,是进行对象管理,对象关联,解耦的一个中间层框架。SSH(Struts+Spring+Hibernate)三大Spring在中间就起着一个承上启下的作用。好,首先我们先来看一下Spring框架的一些知识点,通过下边这张图来总括一下: 好,这篇博客咱们先来对Spring框架进行一个初步的了解。 一,框架介绍: 1,先看一下帮助文档的这张图,里边主要包括了Spring自身的功能,还有可以和其框架结合的一些框架,通过这张图可以看出,Spring框架和其他框架的集成能力是非常强的。 2,Spring是一个轻量级的IOC和AOP容器框架: a,轻量级:程序实现不是很复杂,代码不是很多,占用资源不是很多,没有侵入性; b,IOC(Inversion of Control控制反转):对象创建责任的反转(重点,核心); c,Aop(Aspect Oriented Programming):一种面向横切面编程的思想方式,可以进行功能性扩展,看前边的一篇转载的博客:面向横切面(AOP)编程 d,容器:可以容纳对象,并且可以控制对象的生命周期; 二,看一下使用步骤吧!(框架用多了,感觉步骤都大同小异) 1,还是拷贝jar包: 2,拷贝框架的核心配置文件,存放在src目录下: 3,编写框架的核心配置文件,将声明对象都交给Spring框架来创建,以及初始化,例如service层的类,action层类,dao层类等等,都可以交给Spring进行管理,看一个例子:htmlview plaincopyprint?1. 2. 3. 分析:a,框架创建对象的方式:框架默认创建对象是单例的:scope=singleton当然action我们想要多例创建,需要设置:scope=prototype b,工厂BeanFactory,,如果使用BeanFactory来加载Spring配置文件,那么是在调用getBean时,框架调用对象的默认构造方法来创建对象。BeanFactory功能是对bean对象的生命周期进行管理的。(创建,初始化,销毁)。 c,ApplicationContext(推荐,也是框架默认的)来用才对象来加载Spring配置文件,会在加载时解析配置文件,创建对象,而不是在getBean时创建。其实,ApplicationContext接口继承了BeanFactory,所以具备BeanFactory所有功能,同时增加扩展的功能,例如加载资源配置文件,国际化支持等! 4,如何测试,这里我们可以使用Junit(java的单元测试进行测试)(我们现在是单独使用Spring为了是学习,后边会集成多个框架的)a,先看一下Junit单元测试的使用方法:Junit4详解 b,利用beanFactory加载配置文件:javaview plaincopyprint?1. /加载配置文件,创建Spring的应用环境2. Stringpath=applicationContext.xml;3. Resourceresource=newClassPathResource(path);/推荐4. /Resourceresource=newFileSystemResource(src/applicationContext.xml);5. /Resourceresource=newServletContextResource(servletContext,path);/如果文件存放到WEB-INF目录下6. 7. BeanFactoryfactory=newXmlBeanFactory(resource);8. 9. /从Spring环境中获取对象10. Objectobj=factory.getBean(loginAction);11. 12. 13. LoginActionaction=(LoginAction)obj; c,利用ApplicationContext加载配置文件:javaview plaincopyprint?1. ApplicationContextac=newClassPathXmlApplicationContext(applicationContext.xml);2. 3. Objectobj=ac.getBean(loginAction);4. 这就是Spring的简单使用步骤,当然还有配置文件的如何编写,Aop的使用等,后边会介绍到。 三,Sping框架的优缺点: 优点: 轻量级的容器框架,没有侵入性 IoC更加容易组合对象之间的关系,通过面向接口进行编程,可以低耦合开发。 易于本地测试(Junit单元测试,不用部署服务器) AOP可以更加容易的进行功能扩展,遵循OCP开发原则。 Spring默认对象的创建为单例的,我们不需要再使用单例的设计模式来开发单体类。 Spring的集成很强大,另外可以对其他框架的配置进行一元化管理。 Spring的声明式事务的方便使用。 缺点: 自我感觉是所有框架共有的,就是开发对设计要求较高,集成测试麻烦,对框架有一定的依赖性。总而言之,Spring框架功能是非常强大的,单独使用可能感觉不是很深,和其他的框架结合使用,就会张显她的魅力了。IoC(Inversion of Control)称之为控制反转,指的是在Spring框架的配置文件中声明对象,由框架负责创建对象,这叫做控制反转。实现方式有两种:DI(Dependency Injection)依赖注入,这也是Spring框架的实现方式,主要学习的也是这个;SL(Service Locator)服务器定位器实现方式。 DI依赖注入,就是框架不仅创建了对象,而其还负责初始化相关联的对象的过程。从实现方式上也分为3种方式: a,Interface Injection(接口注入):容器运行时,目标对象实现特定的接口,然后容器通过接口将关联对象注入到目标对象中。这种方式Spring框架不支持,所以了解。 b,Setter Injection(set方法注入):容器运行时,通过类属性的set方法将关联对象注入到目标对象中。Spring框架支持,而且是我们开发经常使用的,非常重要。 c,Constructor Injection(构造方法注入):容器运行时,通过类的构造方法将关联对象注入到对象中。Spring框架也支持,没有set用的普遍。 好,下边主要总结一下set方法注入和构造方法注入。一,Setter Injection: 1,当属性为简单字符串时,可以直接增加property标签:例如:privateString usercode ;privateString userpswd ;setter方法: 是配置文件中property标签的name属性值的set方法htmlview plaincopyprint?1. 2. 3. 4. 5. 2,属性值为引用类型时,通过property中的ref属性来关联对象: privateUserService userService; setter方法htmlview plaincopyprint?1. 2. 3. 4. 5. 3,属性为数组类型时,需要在设置属性值时,将多个元素通过逗号隔开,或者利用list标签:privateString names ;setter方法htmlview plaincopyprint?1. 2. 3. 4. 如果赋值操作中,需要将逗号作为一个整体,那么需要通过特殊的标签进行赋值htmlview plaincopyprint?1. 2. 3. 4. 5. zhang,san6. lisi7. wangwu8. 9. 10. 11. 4,属性为list集合时,也是使用list标签:集合如果使用泛型,只能存储相同类型的元素,不使用泛型,可以存储不同类型的元素:privateList nameList ;setter方法htmlview plaincopyprint?1. 2. 3. 4. zhang,san5. lisi6. wangwu7. 8. 9. 10. 5,当属性为map集合时,需要使用map标签:Private Map map ;setter方法htmlview plaincopyprint?1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 6,属性为Properties集合类型时,需要在设置属性值时,增加props标签privateProperties props ; /继承了Hashtable,是线程安全的setter方法htmlview plaincopyprint?1. 2. 3. 4. jdbc:oracle:thin:7:1521:ljh5. oracle.jdbc.driver.OracleDriver6. scott7. tiger8. 9. 10. 11. 总结:以上为几种常用属性类型的set注入的写法,set方法注入,框架是先通过默认的无参构造方法进行创建对象,然后进行set注入的。当然如果我们重写了构造方法,没有了无参构造呢?这就需要下边的构造方法注入了。二,Constructor Injection 1,例如我们声明了有参构造方法,就需要通过次构造方法进行创建对象和关联对象了,利用constructor-arg标签:javaview plaincopyprint?1. /无参构造方法publicLoginAction(Stringusercode)2. super();3. this.usercode=usercode;4. 5. javaview plaincopyprint?1. 2. 3. 4. 5. 2,如果我们有多个无参构造方法,里边参数可能不同,顺序可能不同等!怎么办呢?其中框架会根据制定的参数个数,type制定的类型,index制定的先后顺序来查找我们想要的构造方法,来进行初始化和对象关联。javaview plaincopyprint?1. 2. 3. 4. 5. 3,构造方法和set方法同时使用也是可以的,它们两者的标签没有先后顺序问题,框架会先调用带参数的构造方法创建对象,然后构造注入数据,再调用set方法进行属性注入。但是自我感觉这种方法尽量少用。htmlview plaincopyprint?1. 2. 3. 4. 5. 6. 三,自动装配功能,就是框架会自动为我们匹配,利用autowire标签来实现,注意这种自动装配功能不支持简单类型(String,int,date等)他有6个值byName,byType,constructor,autodetect,no,default。从字面类型大概看个差不多吧。简单说一下。 1,byName(根据名称),从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找标签的id属性值: 2.byType(根据类型),从Spring环境中获取目标对象时,目标对象中的属性会根据类型在整个spring环境中查找标签的class属性值: 3,constructor:使用构造方法完成对象注入,其实也是根据构造方法的参数类型进行对象查找,相当于采用byType的方式。 4,autodetect(自动选择):如果对象没有无参数的构造方法,那么自动选择constructor的自动装配方式进行构造注入。如果对象含有无参数的构造方法,那么自动选择byType的自动装配方式进行setter注入。 5,no:表示不支持自动装配功能; 6,default:表示默认采用上一级标签的自动装配的取值。标签中的default-autowire属性。如果存在多个配置文件的话,那么每一个配置文件的自动装配方式都是独立的。 分析总结,自动装配就是为了弥补手动装配,如果两者都使用,优先选择手动的。由于自动装配需要在Spring全局环境中搜索,所以性能上会低一些,而且可阅读性较差,所以还是推荐大家使用手动装配功能。综上为Spring框架IOC的基础功能,这样Spring对对象的管理,对彼此之间的解耦起到了非常大的作用,使其优秀的重要条件之一。AOP全名为Aspect-Oriented Programming,意思是面向横切面编程,前边我们有过介绍面向横切面编程AOP的理解,我们通过这种编程思想很容易的扩展我们的应用程序。一,如何实现AOP编程思想呢?实现这种编程思想的一个重要手段就是代理模式或者说模仿代理模式的运用。尤其是其中动态代理模式,JDK提供的Proxy的使用,这个在前边也总结:Proxy代理模式的应用 而这种动态代理是基于接口的,也就是说代理对象和目标对象实现了同一个接口。而假如我们应用中没有使用接口,就无法使用Proxy了。但是不要着急,CGLIB这个组件解决了这个问题,它正是弥补jdk中的不足,专门基于继承来实现动态代理,其中代理对象是继承目标对象进行扩展的。它和JDK提供的Proxy实现原理是非常类似的。这里看一下网上的资料吧:java动态代理(JDK和cglib)二,事务(Trasaction)这个在数据库中我们学习过,为什么在这里又提出来呢?因为Spring框架运用在我们的service层。而事务的应用正是用到一个业务当中,也就是我们的Service层,所以声明式事务在Spring框架中的应用,也是其实现AOP编程思想非常出色的地方。下边先看一下事务的基础知识。 1,事务的四大特性:原子性:指的是数据库事务是一个不可分割的工作单元一致性:指的是数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。隔离性:并发环境中,当不同的事务同时操作相同的数据时,每个事务都有各自的完整数据空间。持久性:只有事务提交,数据就所做的更新操作必须永久保存下来。 2,多个事务嵌套时,几种设置方法:方式说明REQUIRED:业务方法需要在一个事务中运行,如果方法运行时,已经存在一个事务中,那么加入到该事务,否则自己创建一个新事务。SUPPORTS:如果存在一个事务,那么使用当前事务,如果没有事务,则不使用事务。MANDATORY:如果有一个事务,则使用事务,如果没有可以使用的事务,则发生异常。REQUIRESNEW:不管是否存在事务,业务方法总为自己发起一个新事务;如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法调用结束,新事务才结束,原先的事务再恢复执行。NOT_SUPPORTED:声明方法不需要事务,如果方法没有关联到事务,容器不会为它开启事务,如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。NEVER:业务方法绝对不能再事务范围内执行,如果方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,方法才能够正常执行。NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按照REQUIRED属性执行,它使用了一个单独的事务,这个事务有多个可以回滚的保存点,内部事务的回滚不会对外部事务产生影响。它只对DataSourceTransactionManager事务管理器有效。 3,事务的隔离级别:级别说明ISOLATION_DEFAULT这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应ISOLATION_READ_UNCOMMITTED这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读ISOLATION_READ_COMMITTED(Oracle默认隔离级别)保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。ISOLATION_REPEATABLE_READ(MySQL默认隔离级别)这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。(行级锁 select。for update)ISOLATION_SERIALIZABLE这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。 三,声明式事务的使用: Spring默认情况下是不支持AOP功能的,如果使用需要引入AspectJjar包。AspectJ是专门来做AOP操作的框架,Spring可以利用AspectJ进行AOP编程。看一下步骤吧! 1,拷贝相应的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论