Spring框架
- 前言
- 一、Spring是什么/li>
- 二、Spring的优势
-
- 2.1、Spring的体系结构
- 2.2、核心容器
- 三、Spring核心之loC控制反转
-
- 3.1loC的概念
- 3.2 Spring容器
-
- 3.2.1 BeanFactory
- 3.2.2 ApplicationContext
- 3.2.3 bean标签的属性
- 四、 Srping核心之AOP
-
- 4.1 什么是AOP
- 4.2 AOP的实现机制-动态代理
-
- 4.2.1 什么是代理模式
- 4.2.2基于CGLIB的动态代理
- 4.3 SpringAOP
-
- 4.3.1 Spring AOP相关概念
- 4.3.2 Aspectj对AOP的实现
-
- 4.3.2.1 Aspectj的通知类型
- 4.3.2.2 AspectJ的切入点表达式
- 五、Spring事务管理
-
- 5.1 Spring事务管理API
-
- 5.1.1事物管理器接口
- 5.1.2 事物定义接口
-
- 5.1.2.1事物隔离级别常量
- 5.1.2.2 事物传播行为常量
- 5.1.2.3 默认事物超时时限
- 5.2 声明式事物控制
前言
框架(Framework) : 框(指其约束性)架(指其支撑性),在软件设计中指为解决一个开放性问题而设计的具有一定约束性的支撑结构。在次结构上可以根据具体问题扩展、安插更多的组成部分,从而更迅速和方便地构建完整的解决问题的方案。
一、Spring是什么/h2>
Spring 被称为J2EE的春天,是一个分层的java SE/EE full-stack开源的轻量级的java开发框架,是最受欢迎的企业级java应用程序开发框架,数以百万的来自世界格第的开发人员使用Spring框架来创建性能好、易于测试、可重用的代码
Spring具有控制反转(loC)和面向切面(AOP) 两大核心。java Spring 框架通过声明方式灵活地进行事物的管理,提高开发效率和质量。
Spring框架不仅限于服务器端的开发,从简单性、可测试性和松耦合的角度而言、任何java应用都可以从Spring中收益。Spring框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。
二、Spring的优势
1、方便解耦,简化开发
2、方便集成各种优秀框架
3、降低Java EE API 的使用难度
4、方便程序的测试
5、AOP编程的支持
6、声明式事物的支持
2.1、Spring的体系结构
Spring 为我们提供了一站式解决方案,但Spring是模块化的,允许挑选和选择适用于项目的模块,不需要把剩余部分也引入。
Spring框架提供约20个模块,可以根据应用程序的要求来选择
2.2、核心容器
核心容器由 Spring-core,Spring-beans,Spring-context,Spring-context-support和Springexpression(SpEL,Spring 表达式语言,Spring Expression Language)等模块组成
Spring-core 模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
Spring-beans 模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且
可以把配置和依赖从实际编码逻辑中解耦。
context 模块建立在由 core和 beans 模块的基础上建立起来的,它以一种类似于 JNDI 注册的方
式访问对象。Context 模块继承自 Bean 模块,并且添加了国际化(比如,使用资源束)、事件传
播、资源加载和透明地创建上下文(比如,通过 Servelet 容器)等功能。Context 模块也支持 Java
EE 的功能,比如 EJB、JMX 和远程调用等。ApplicationContext 接口是 Context 模块的焦点。
Spring-context-support 提供了对第三方集成到 Spring 上下文的支持,比如缓存(EhCache,
Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker,
JasperReports, Velocity)等。
Spring-expression 模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是 JSP2.1
规范中定义的统一表达式语言的扩展,支持 set 和 get 属性值、属性赋值、方法调用、访问数组集
4、方便程序的测试
Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。
5、AOP 编程的支持
Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
6、声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无须手动编程。合及索引的内容、逻辑算术运算、命名变量、通过名字从 Spring IoC 容器检索对象,还支持列表的
投影、选择以及聚合等。
它们的完整依赖关系如下图所示:
四、 Srping核心之AOP
4.1 什么是AOP
AOP为Aspect Oriented Programming的缩写,意思为面向切面编程,是通过预编译方式和运行期动态
代理实现程序功能的统一维护的一种技术。
AOP的作用:不修改源码的情况下,程序运行期间对方法进行功能增强
好处:1、减少代码的重复,提高开发效率,便于维护。
2、专注核心业务的开发。
核心业务和服务性代码混合在一起
开发中:各自做自己擅长的事情,运行的时候将服务性代码织入到核心业务中。
通过spring工厂自动实现将服务性代码以切面的方式加入到核心业务代码中。
4.2 AOP的实现机制-动态代理
4.2.1 什么是代理模式
代理:自己不做,找人帮你做。
代理模式:在一个原有功能的基础上添加新的功能。
分类:静态代理和动态代理。
4.2.2基于CGLIB的动态代理
Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。
JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有
实现接口的类,就可以使用CGLIB实现。
CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的
被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception。
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓
励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
4.3 SpringAOP
4.3.1 Spring AOP相关概念
Spring的AOP实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分
进行代码编写,并通过配置的方式完成指定目标的方法增强。
我们先来介绍AOP的相关术语:
Target(目标对象)
要被增强的对象,一般是业务逻辑类的对象。
Proxy(代理)
一个类被 AOP 织入增强后,就产生一个结果代理类。
Aspect(切面)
表示增强的功能,就是一些代码完成的某个功能,非业务功能。是切入点和通知的结合。
Joinpoint(连接点)
所谓连接点是指那些被拦截到的点。在Spring中,这些点指的是方法(一般是类中的业务方法),因为 Spring只支持方法类型的连接点。
Pointcut(切入点)
切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法。 被标记为 final
的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。
Advice(通知/增强)
所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。通知定义了增强代码切入到目标代码的时
间点,是目标方法执行之前执行,还是之后执行等。通知类型不同,切入时间不同。 通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
切入点定义切入的位置,通知定义切入的时间。
Weaving(织入).
是指把增强应用到目标对象来创建新的代理对象的过程。 spring 采用动态代理织入,而 AspectJ 采用编 译期织入和类装载期织入。
切面的三个关键因素:
1、切面的功能–切面能干啥
2、切面的执行位置–使用Pointcut表示切面执行的位置
3、切面的执行时间–使用Advice表示时间,在目标方法之前还是之后执行。
4.3.2 Aspectj对AOP的实现
对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可以完成面向切面编程。
AspectJ 也实现了 AOP 的功能,且其实现方式更为简捷而且还支持注解式开发。所以,Spring 又将
AspectJ 的对于 AOP 的实现也引入到了自己的框架中。
在 Spring 中使用 AOP 开发时,一般使用 AspectJ 的实现方式
AspectJ 是一个优秀面向切面的框架,它扩展了 Java 语言,提供了强大的切面实现
4.3.2.1 Aspectj的通知类型
AspectJ 中常用的通知有5种类型:
- 前置通知
- 后置通知
- 环绕通知
- 异常通知
- 最终通知
4.3.2.2 AspectJ的切入点表达式
以上表达式共 4 个部分。
execution(访问权限 方法返回值 方法声明(参数) 异常类型)
切入点表达式要匹配的对象就是目标方法的方法名。所以,execution 表达式中就是方法的签名。
PS:表达式中黑色文字表示可省略部分,各部分间用空格分开。在其中可以使用以下符 :
5.1.2 事物定义接口
事务定义接口 TransactionDefinition 中定义了事务描述相关的三类常量:事务隔离级别、事务传播行
为、事务默认超时时限,及对它们的操作

5.1.2.1事物隔离级别常量
这些常量均是以 ISOLATION_开头。即形如 ISOLATION_XXX。
? DEFAULT:采用 DB 默认的事务隔离级别。MySql 的默认为 REPEATABLE_READ; Oracle默认为
READ_COMMITTED。
? READ_UNCOMMITTED:读未提交。未解决任何并发问题。
? READ_COMMITTED:读已提交。解决脏读,存在不可重复读与幻读。
? REPEATABLE_READ:可重复读。解决脏读、不可重复读,存在幻读
? SERIALIZABLE:串行化。不存在并发问题。
5.1.2.2 事物传播行为常量
所谓事务传播行为是指,处于不同事务中的方法在相互调用时,执行期间事务的维护情况。如,A 事务
中的方法 doSome()调用 B 事务中的方法 doOther(),在调用执行期间事务的维护情况,就称为事务传
播行为。事务传播行为是加在方法上的。
事务传播行为常量都是以 PROPAGATION_ 开头,形如 PROPAGATION_XXX。
Propagation.REQUIRED
当前没有事务的时候,就会创建一个新的事务;如果当前有事务,就直接加入该事务,比较常用的
设置 Propagation.SUPPORTS
支持当前事务,如果当前有事务,就直接加入该事务;当前没有事务的时候,就以非事务方式执行
Propagation.MANDATORY
支持当前事务,如果当前有事务,就直接加入该事务;当前没有事务的时候,就抛出异常
Propagation.REQUIRES_NEW
创建新事务,无论当前是否有事务都会创建新的
PROPAGATION_NESTED
PROPAGATION_NEVER
PROPAGATION_NOT_SUPPORTED
5.1.2.3 默认事物超时时限
常量 TIMEOUT_DEFAULT 定义了事务底层默认的超时时限,sql 语句的执行时长。
注意,事务的超时时限起作用的条件比较多,且超时的时间计算点较复杂。所以,该值一般就使用默认 值即可。
5.2 声明式事物控制
Spring提供的对事务的管理,就叫做声明式事务管理。
如果用户需要使用spring的声明式事务管理,在配置文件中配置即可:不想使用的时候直接移除配置。
这种方式实现了对事务控制的最大程度的解耦。
声明式事务管理,核心实现就是基于AOP
Spring中提供了对事务的管理。开发者只需要按照spring的方式去做就行。
事务必须在service层统一控制。
事务的粗细粒度:
细粒度:对方法中的某几行的代码进行开启提交回滚;
粗粒度:对整个方法进行开启提交回滚;
Spring中的aop只能对方法进行拦截,所有我们也就针对方法进行事务的控制。
如果只有单条的查询语句,可以省略事务;如果一次执行的是多条查询语句,例如统计结果、 表查询。必须
开启事务。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92564 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!