ch05-ch07

随声附和 提交于 2019-11-27 03:39:08

第五章 Spring 核心概念
5.1 初始Spring
5.1.1 Spring的“绿草丛”
Spring确实给人一种格外清新、爽朗的感觉,仿佛微雨后的绿草丛,讨人喜欢,又蕴藏着勃勃生机。Spring是一个轻量级框架,它大大简化了Java企业级开发,提供了强大、稳定的功能,又没有带来额外的负担,让人们在使用它做每件事情的时候都有得体和优雅的感觉。Spring 有两个主要目标:一是让现有技术更易于使用,二是促进良好的编程习惯(或者称为最佳实践)。

  Spring 是一个全面的解决方案,但它坚持-一个原则:不重新发明轮子。已经有较好解决方案的领域,Spring绝不做重复性的实现。例如,对象持久化和ORM, Spring 只是对现有的JDBC、MyBatis.Hibenate等技术提供支持,使之更易用,而不是重新做- - 个实现。

  Spring 框架由大约20个功能模块组成。这些模块被分成六个部分,分别是Core Container. DataAccess/integation. Web. AOP (Aspect Oriented Programming). Instumentation及 Test,如图5 .1所示。

  Spring Core是框架的最基础部分,提供了loC 特性。Spring Context为企业级开发提供了便利和集成的工具.SpingAOP是基于Spring Core的符合规范的面向切面编程的实现。Spring JDBC提供了JDBC的抽象层,简化了JDBC编码,同时使代码更健壮。Spring ORM对市面上流行的ORM框架提供了支持。Suring Wec为Spring在Web应用程序中的使用提供了支持。关于Sping的其他功能模块在开发中的作用可以查阅Spring的文档进行了解,这里不再赘述。

5.2 Spring IoC
5.2.1 理解“控制反转”

控制反转(Inversion of Control, IoC),也称为依赖注入(Dependency Injection ,DI),是面向对象编程中的一中设计理念,用来降低程序代码之间的耦合度。
首先考虑什么事依赖。依赖,在代码中一般指通过局部变量、方法参数、返回值等建立的对于其他对象的调用关系。例如,在A类的方法中,实例化了B类的对象并调用其方法以完成特定的功能,我们就说A类依赖于B类。
几乎所有的应用都是由两个或更多的类通过彼此合作来实现完整的功能。类与类之间的依赖关系增加了程序开发的复杂程度,我们在开发一个类的时候,还要考虑对正在使用该类的其他类的影响。例如,常见的业务层调用数据访问层实现持久化操作。

5.3 Spring AOP
5.3.1 理解“面向切面编程”

面向切面编程(Aspect Oriented Programming, AOP) 是软件编程思想发展到一定阶段的产物,是对面向对象编程(Objec Oriented Programming, OOP)的有益补充。AOP一般适用于具有横切逻辑的场合,如何访问控制、事务管理、性能监测等。

  1. 切面 (Aspect); 一个模块化的横切逻辑(或称横切关注点), 可能会横切多个对象。
  2. 连接点(Join Point)程序执行中的某个具体的执行点。如图5.8中原对象的n)方法献
    是一个连接点。
  3. 增强处理 (Advice); 切面在某个特定连接点上执行的代码逻辑。
  4. 切入点Ponma) 对连接点的特征进行描述,可以使用正则表达式。增强处理和一个切入
    点表达式相关联,并在与这个切入点匹配的某个连接点上运行。
  5. 目标对象(Target obiect):被一个或多个切面增强的对象。
  6. AOP代理 (AOP proxy):由AOP框架所创建的对象,实现执行增强处理方法等功能。
  7. 织入 (Weaving): 将增强处理连接到应用程序中的类型或对象上的过程。
  8. 增强处理类型:如图5.8所示,在原对象的fun()方法之前插入的增强处理为前置增强,该方法正常执行完以后插入的增强处理为后置增强,此外还有环绕增强、异常抛出增强、最终增强等类型。

第六章 IoC和AOP使用扩展

6.1 多种方式实现依赖注入

6.1.1 构造注入
经验:
(1)一个元素表示构造方法的一个参数,且使用时不区分顺序。当构造方法的参数出现混淆,无法区分时,可以通过元素的index 属性指定该参数的位置索引,位置从0开始。元素还提供了type 属性用来指定参数的类型,避免字符串和基本数据类型的混淆。
(2) 构造注入的时效性好,在对象实例化时就得到所依赖的对象,便于在对象的初始化方法中使用依赖对象;但受限于方法重载的形式,使用灵活性不足。设值注入使用灵活,但时效性不足,并且大量的setter访问器增加了类的复杂性。Spring并不倾向于某种注入方式,用户应该根据实际情况进行合理的选择。
当然Spring提供的注入方式不只这两种,只是这两种方式用得最普遍,有兴趣的学员司以通过Spring的开发手册了解其他注入方式。

6.1.2 使用p命名空间实现属性注入
Spring配置文件从2.0版本开始采用schema形式,使用不同的命名空间管理不同类型的配置,使得配置文件更具扩展性。例如,我们曾使用aop命名空间下的标签实现织入切面的功能,而在本章及之后章节的学习中,我们还会接触更多其他命名空间下的配置。此外,Spring 基于schema 的配置方案为许多领域的问题提供了简化的配置方法,大大简化了配置的工作量。在本节中,我们将体验使用p命名空间简化属性的注入。

P命名空间的特点是使用属性而不是子元素的形式配置Bean的属性,从而简化了Bean的配置,使用传统的子元素配置的代码如示例3所示:

在这里插入图片描述

使用p命令空间改进配置,注意使用前要先添加p命名空间的声明。关键代码如示例4所示:

在这里插入图片描述
在这里插入图片描述

语法
P:属性名=“属性值”
对于引用bean的属性,使用方式如下
语法:
P:属性名-ref=”Bran的id”

6.1.3 注入不同数据类型

Spring提供了不同的标签来实现各种不同类型参数的注入,这些标签对于设值注入和构造注入都适用。在本节中,将以设值注入的形式介绍,对于构造注入,只需将锁介绍的标签添加到与</ constructor-arg>

  1. 注入直接量(基本数据类型、字符串)
    对于基本数据类型及其包装类、字符串,除了可以使用value属性,还可以通过子元素进行注入,关键代码如示例5所示。

在这里插入图片描述
如果属性值中包含了XML中的特殊字符(&、<、>、”、‘),则注入时需要进行处理。通常可以采用两种办法:使用<![CDATA[]]>标记或把特殊字符替换为实体引用。关键代码如示例6所示。
在这里插入图片描述在这里插入图片描述

  1. 引用其他Bean组件
    Spring中定义的Bean可以互相引用,从而建立依赖关系,除了使用ref属性,还可以通过子元素实现。

本章总结
➢Spring提供了设值注入, 构造注入等依赖注入方式。
➢使用p命名空间可以简化属性注入的配置 。
➢Sping 提供的增强处理类型包括前置增强、后置增强、异常抛出增强、环绕增强、最终增
强等。
通过Schema形式将POJO的方法配置成切面,所用标签包括<aop: aspect>. < aop before>.<aop: after-returning>, <aop: around>.< aop : after -throwing>、< Kaop : after>等。
用来定义Bean组件的注解包括@Component. @Repository. @Service. @Controller.
➢Bean 组件的装配可以通过@Autowired. @Qualifier 以及@Resource实现。
➢ 在Spring配置文件中使用<context: component scan>元素扫描包含注解的类,完成初始化。
➢使用注解方式定义切面可以简化配置工作, 常用注解有@Aspect. @Before. @AfterRetuning.
@Around. @AfterThrowing. @After 等。
通过在配置文件中添加<aop ? aspec autoproxy>元素就可以启用对于@AspectJ注解的支持。

第七章 MyBatis与Spring的整合
7.1 Spring对MyBatis的整合思路
作为Bean容器,Spring框架提供了IoC机制,可以接管所有组件的创建工作并进行依赖管理,因而整合的主要工作就是把MyBatis框架使用中所涉及的核心组件配置到Spring容器中,交给Spring来创建和管理。
具体来说,业务逻辑对象依赖基于MyBatis技术实现的DAO对象,核心是获取SQLSession实例。要获得SqlSession实例,则需要依赖SqlSessionFactory实例。而SqlSessionFactoy是SqlSessionFactoryBuilder依据MyBatis配置文件中的数据源,SQL映射文件等信息来构建的。
针对上述依赖关系,以往我们需要自行编码通过SqlSessionFactoryBuilder读取配置文件、构建SqlSessionFactory,进而获得SqlSession实例,满足业务逻辑对象对于数据访问的需要。随着Spring框架的引入,以上流程将全部移交给Spring,发挥Spring框架Bean容器的作用,接管组件的创建工作,管理组件的生命周期,并对组件之间的依赖关系进行解耦合管理。

7.2 Spring整合MyBatis的准备工作

  1. 在项目中加入Spring、MyBatis及整合相关的JAR文件在使用Spring整合MyBatis之前,首先要下载与整合相关的JAR文件。由于Spring 3的开发在MyBatis 3官方发布前就结束了,Spring开发团队不想发布一个基于非发布版本的MyBatis的整合支持,因此Spring 3没有提供对MyBatis 3的支持。为了使Spring 3支持MyBatis 3,MyBatis团队按照Spring集成ORM框架的统一风格开发了相关整合组件,令开发者可以在Spring中集成使用MyBatis。
    在GitHub上可以找到MyBatis-Spring整合资源包(hhtps://github.com/mybatis/Spring/releases),选择所需的版本下载,这里选择的事Mybatis-spring 1.2.0版本,下载mybatis-spring-1.2.0.zip并解压后的目录如图7.1所示
    在这里插入图片描述

整合是,在项目中只要包含mybatis-spring-1.2.0.jar就可以了,也可根据需要配置源代码和javaDoc资源以便学习。
由于在整合中还会用到Spring的数据源支持以及事务支持,因此还需在项目中加入spring-jdbc-3.2.13.RELEASE.jar和spring-tx-3.2.13.RELEASE.jar两个JAR文件。
项目所需的JAR文件如图7.2所示。

在这里插入图片描述

7.3 实现Spring对MyBatis的整合

7.3.1 配置数据源

对于任何持久化解决方案,数据库连接都是首先要解决的问题。在Spring 中,数据源作为一个重要的组件可以单独进行配置和维护。在示例4中,我们将MyBatis配置文件中有关数据源的配置移除.转移到Spring 配置文件中进行维护。

  在Spring中配置数据源,首先要选择一种具体的数据源实现技术。目前流行的数据源实现有dbcp. c3p0、 Proxool 等,它们都实现了连接池功能。这里以配置dbcp数据源为例进行讲解,其他数据源的配置方法与此类似,大家可以自行查阅相关资料进行学习。dbcp数据源隶属于Apache Commons项目,使用dbcp数据源,需要下载并在项目中添加commons- -dbcp-1. 4. jar和commons pool-1.6. jar两个文件,如图7.3所示。Spring 配置数据源的方法如示例5所示。

在这里插入图片描述

建立Spring配置文件applicationContext-mybatis.xml配置数据源的关键代码:

在这里插入图片描述

7.3.2 配置SqlSessionFactoryBean
配置完数据源,就可以在此基础上集合SQL映射文件信息以及MyBatis配置文件中的其他信息,创建SqlSessionFactory实例。
在MyBatis中,SqlSessionFactory的实例需要使用SqlSessionFactoryBuilder创建;而在集成环境中,则可以使用MyBatis-Spring整合包中的SqlSessionFactoryBean来代替。SqlSessionFactoryBean封装了使用SqlSessionFactoryBuilder创建SqlSessionFactory的过程,我们可以在Spring中以配置文件的形式,通过配置SqlSessionFactoryBean获得SqlSessionFactory实例。
在这里插入图片描述

7.4 注入映射器实现

7.4.1 使用MapperScannerConfigurer注入映射器
在Spring配置文件中使用MapperFactorybean对映射器做配置,简化了DAO模块的编码,不过如果映射器很多,相应的配置项也会很多。为了简化配置工作量,MyBatis-Spring中提供了MapperScannerConfigurer,它可以扫描指定包中的接口并将它们直接注册为MapperFactoryBean。

在这里插入图片描述

7.5 为业务层添加声明式事务
7.5.1 配置声明式事务
tx:method标签中的name属性是必需的,用于指定匹配的方法。这里需要对方法名进行约定,可以使用通配符(*)。其他属性均可选,用于指定具体事务规则,浙西属性解释如下。

  1. popagatin 事务传播机制。该属性可选的值有如下几种。
    ◆ REOURED默认值表示如果存在一个事务, 则支持当前事务:如果当前没有事务,
    则开启一个新的事务。
    ◆ REQUIRES NEW:表示总是开启一个新的事务。如果-一个事务已经存在,则将这个存在
    的事务挂起,开启新事务执行该方法。
    ◆MANDATORY: 表示如果存在一一个事务,则支持当前事务:如果当前没有-个活动的事
    务,则抛出异常。
    ◆ NESTED:表示如果当前存在一个活动的事务,则创建一个事务作 为当前事务的嵌套事
    务运行:如果没有当前事务,该取值与REQUIRED相同。
    ◆SUPPORTS: 表示如果存在一个事务,则支持当前事务:如果当前没有事务,则按非事
    务方式执行。
    ◆ NOT_SUPPORTED:表示总是以非事务方式执行。如果一个事务已经存在,则将这个存
    在的事务挂起,然后执行该方法。
    ◆ NEVER:表示总是以非事务方式执行。如果当前存在一个活动的事务, 则抛出异常。

isolation 事务隔高等级即当前事务和其他事务的隔离程度,在并发事务处理的情况下有
要考虑它的设置。该属性可选的值有如下几种。
◆ DEFAULT默认值表示使用数据库默认的事务隔离级别。◆ READ UNCOMMITTED:未提交读。◆ READ COMMITTED:提交读。◆ REPEATABLE READ:可重复读。◆SERIALIZABLE: 串行读。
timeout:事务超时时间。允许事务运行的最长时间,以秒为单位,超过给定的时间自动回滚,防止事务执行时间过长而影响系统性能。该属性需要底层的实现支持。默认值为-1 .表示不超时。
➢read-only: 事务是否为只读, 默认值为false。对于只执行查询功能的事务.把它设置 为true,
能提高事务处理的性能,
rollback -for: 设定能够触发回滚的异常类型。Spring 默认只在抛出Runtime Exception时才标识事务回滚。可以通过全限定类名自行指定需要回滚事务的异常,多个类名用英文逗号隔开。
➢no rllback-for设定不触发回滚的异常类型。Spring 默认checked Exception不会触发事务
回滚。可以通过全限定类名自行指定不需回滚事务的异常,多个类名用英文逗号隔开。设置完事务规则,最后还要定义切面,将事务规则应用到指定的方法上。代码如示例18所示。

在这里插入图片描述

至此,Spring的声明式事务就配置完成了,最后在总结一下配置的步骤

  1. 导入tx和aop命名空间
  2. 定义事务管理器Bean,并为其注入数据源Bean
  3. 通过tx:advice配置事务增强,绑定事务管理器并针对不同方法定义事务规则。
  4. 配置切面,将事务曾倩与方法切入点组合。

7.5.3 使用注解实现声明式事务处理

在业务实现类上添加@Transactional注解即可为该类的所有业务方法统一添加事务处理。如果某一业务方法需要采用不同的事务规则,可以在该业务方法上添加@trabsactuinal注解单独进行设置。
@Transactional注解也可以设置事务属性的值,默认的@Transactional设置如下。

  1. 事务传播设置是PROPAGATION_REQUIRED。
  2. 事务隔离级别是ISOLATION_DEFAULT。
  3. 事务是读/写。
  4. 事务超时默认是依赖于事务系统的,或者事务超时没有被支持
  5. 任何RuntimeException将触发事务回滚,但是任何checked Exception将不触发事务回滚。
    这些默认的设置当然也是可以改变的。@Transactional注解的各属性如表7-1所示

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!