Spring
2021-07-05 22:37:13 6 举报
AI智能生成
本人对Spring的理解
作者其他创作
大纲/内容
常见异常与解决
切点表达式错误
分析:该异常主要看caused by后面第一句提示信息:PointcutExpression,意思是切点表达式语法错误,找到配置文件中的切点表达式
其中蓝色框标记表达式只定位到了包中所有的类,并未指定类中的方法,所以需要修改:或指定包下某个具体的方法。
图形结构
图形结构解析
简介
Spring是一款应用于业务逻辑层的轻量级开源框架,
主要解决业务逻辑层和其它各层的松耦合问题。
主要解决业务逻辑层和其它各层的松耦合问题。
IOC和DI
IOC
IOC:控制反转,它是一种设计思想,将原本在程序中
手动创建对象的控制权,交由Spring框架来管理。
手动创建对象的控制权,交由Spring框架来管理。
DI
DI:依赖注入,在程序运行时,动态的向某个对象提供所需的对象。
它能让我们更好理解IOC,让程序依赖于Spring容器。【方便我们更好的理解IOC】
它能让我们更好理解IOC,让程序依赖于Spring容器。【方便我们更好的理解IOC】
案例【用程序解刨IOC和DI】
总结
Bean
简介
被Spring 容器管理的Java对象
作用域
在 Spring 里面,可以设置创建 bean 实例
是单实例还是多实例对象,默认为单实例对象
是单实例还是多实例对象,默认为单实例对象
生命周期
从对象创建到销毁的过程
自动装配
根据指定装配规则(属性名称或者属性类型),
Spring 自动将匹配的属性值进行注入
Spring 自动将匹配的属性值进行注入
AOP
简介
面向切面编程,是一种新的程序设计思想,
对传统OOP的补充。
面向对象 纵向继承机制
面向切面 横向抽取机制
对传统OOP的补充。
面向对象 纵向继承机制
面向切面 横向抽取机制
AOP术语
通知(Advice)
实际增强的逻辑部分就是通知,通知分为
前置通知,后置通知,返回通知,异常通知,环绕通知
【就是你想要的功能,也就是上说的安全、事物、日子等。
你给先定义好,然后再想用的地方用一下。】
前置通知,后置通知,返回通知,异常通知,环绕通知
【就是你想要的功能,也就是上说的安全、事物、日子等。
你给先定义好,然后再想用的地方用一下。】
切入点(Pointcut)
实际被增强的方法,在连接点的基础上,来定义切入点。
【假如你的一个类里,有十多个方法,那就有十几个连接点了对吧,
但是你并不想在所有方法附件都使用通知(也叫织入),
你只是想让其中几个,在调用这几个方法之前、之后或者抛出异常时干点什么,
那么就用切入点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。】
【假如你的一个类里,有十多个方法,那就有十几个连接点了对吧,
但是你并不想在所有方法附件都使用通知(也叫织入),
你只是想让其中几个,在调用这几个方法之前、之后或者抛出异常时干点什么,
那么就用切入点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。】
连接点(Joinpoint)
类中哪些方法需要被增强,这些方法就叫做连接点
【就是spring允许你是通知的地方】
【就是spring允许你是通知的地方】
切面(Aspect)
把通知应用到切点的过程
注
连接点就是为了让你好理解切点搞出来的,明白概念就行了。
通知说明了干什么和什么时候干什么。
切入点说明了在哪干(指定到底是哪个方法)。
通知说明了干什么和什么时候干什么。
切入点说明了在哪干(指定到底是哪个方法)。
AOP意义
不修改目标对象的源代码情况下实现对目标对象相关方法的增强
代理
静态代理
案例
概述
与静态代理不同,动态代理就是说 AOP 框架不会去修改编译时生成的字节码,
而是在运 行时在内存中生成一个 AOP 代理对象,
这个 AOP 对象包含了目标对象的全部方法,
并且在 特定的切点做了增强处理,并回调原对象的方法。
而是在运 行时在内存中生成一个 AOP 代理对象,
这个 AOP 对象包含了目标对象的全部方法,
并且在 特定的切点做了增强处理,并回调原对象的方法。
概述
动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的
动态代理
概述
AOP 框架会在编译阶段生成 AOP 代理类,因此也称为编译时增强。
分类
基于接口动态代理
JDK动态代理
概述
JDK动态代理机制中有两个重要的类和接口InvocationHandler(接口)和Proxy(类),
类Proxy和接口InvocationHandler是我们实现动态代理的核心;
类Proxy和接口InvocationHandler是我们实现动态代理的核心;
案例
基于类的动态代理
CGLIB动态代理
概述
CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,
并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。
但因为采用的是继承,所以不能对final修饰的类进行代理。
并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。
但因为采用的是继承,所以不能对final修饰的类进行代理。
案例
AOP 操作-前置工作
Spring基于 AspectJ 实现 AOP 操作
概述
AspectJ 不是 Spring 组成部分,而是一个独立 AOP 框架,
一般把 AspectJ 和 Spirng 框架结合在一起使用,进行 AOP 操作。
一般把 AspectJ 和 Spirng 框架结合在一起使用,进行 AOP 操作。
(1)基于 xml 配置
案例
AspectJ案例
(2)基于注解方式
案例
切入点表达式
语法结构
execution([权限修饰符] [返回类型] [类全路径] [方法名称]([参数列表]) )
JdbcTemplate
概述
为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,
以此建立一个JDBC存取(CRUD)框架。
可以将Spring的JdbcTemplate看作是一个小型的轻量级持久化层框架。
以此建立一个JDBC存取(CRUD)框架。
可以将Spring的JdbcTemplate看作是一个小型的轻量级持久化层框架。
jdbc.properties配置文件
引入外部配置文件,
创建数据源bean
创建数据源bean
创建JdbcTemplate 对象bean
增删改查
1)增删改
2)批量增删改
3)查询单行多列
(如果没有数据会直接抛出异常,需要引用try进行相关的处理)
JdbcTemplate.queryForObject(String, RowMapper<Department>, Object...)
JdbcTemplate.queryForObject(String, RowMapper<Department>, Object...)
4)查询单一值(一行一列)
5)查询多行
事务
概述
1)在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,
必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中
必不可少的技术。
必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中
必不可少的技术。
2)事务就是一组由于逻辑上紧密关联而合并成一个整体
(工作单元)的多个数据库操作,这些操作要么都执行,要么都不执行。
(工作单元)的多个数据库操作,这些操作要么都执行,要么都不执行。
3)事务的四个关键属性(ACID)
①原子性(atomicity)
“原子”的本意是“不可再分”,事务的原子性表现为一个事务中
涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中
的所有操作要么都执行,要么都不执行。
涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中
的所有操作要么都执行,要么都不执行。
②一致性(consistency)
“一致”指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。
一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据
是正确的,事务执行之后数据仍然是正确的。如果一个事务在执行的过程中,
其中某一个或某几个操作失败了,则必须将其他所有操作撤销,
将数据恢复到事务执行之前的状态,这就是回滚。
一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据
是正确的,事务执行之后数据仍然是正确的。如果一个事务在执行的过程中,
其中某一个或某几个操作失败了,则必须将其他所有操作撤销,
将数据恢复到事务执行之前的状态,这就是回滚。
③隔离性(isolation)
在应用程序实际运行过程中,事务往往是并发执行的,
所以很有可能有许多事务同时处理相同的数据,
因此每个事务都应该与其他事务隔离开来,防止数据损坏。
隔离性原则要求多个事务在并发执行过程中不会互相干扰。
所以很有可能有许多事务同时处理相同的数据,
因此每个事务都应该与其他事务隔离开来,防止数据损坏。
隔离性原则要求多个事务在并发执行过程中不会互相干扰。
④持久性(durability)
持久性原则要求事务执行完成后,对数据的修改永久的保存下来,
不会因各种系统错误或其他意外情况而受到影响。通常情况下,
事务对数据的修改应该被写入到持久化存储器中。
不会因各种系统错误或其他意外情况而受到影响。通常情况下,
事务对数据的修改应该被写入到持久化存储器中。
事务前置案例
事务分类
编程式事务管理
概述
需要将事务管理代码嵌入到业务方法中来控制事务的提交和回滚。
在使用编程的方式管理事务时,必须在每个事务操作中包含额外的事务管理代码。
相对于核心业务而言,事务管理的代码显然属于非核心业务,
如果多个模块都使用同样模式的代码进行事务管理,显然会造成较大程度的代码冗余。
在使用编程的方式管理事务时,必须在每个事务操作中包含额外的事务管理代码。
相对于核心业务而言,事务管理的代码显然属于非核心业务,
如果多个模块都使用同样模式的代码进行事务管理,显然会造成较大程度的代码冗余。
声明式事务管理
概述
将事务管理代码从业务方法中分离出来(AOP),以声明的方式来实现事务管理。
事务管理代码的固定模式作为一种横切关注点,可以通过AOP方法模块化,
进而借助Spring AOP框架实现声明式事务管理。
事务管理代码的固定模式作为一种横切关注点,可以通过AOP方法模块化,
进而借助Spring AOP框架实现声明式事务管理。
(1)基于注解方式
(2)基于 xml 配置文件方式
扩展
Spring在不同的事务管理API之上定义了一个抽象层,通过配置的方式使其生效,
从而让应用程序开发人员不必了解事务管理API的底层实现细节,
就可以使用Spring的事务管理机制。Spring既支持编程式事务管理,
也支持声明式的事务管理。
从而让应用程序开发人员不必了解事务管理API的底层实现细节,
就可以使用Spring的事务管理机制。Spring既支持编程式事务管理,
也支持声明式的事务管理。
事务管理器
概述
Spring从不同的事务管理API中抽象出了一整套事务管理机制,
让事务管理代码从特定的事务技术中独立出来。
开发人员通过配置的方式进行事务管理,而不必了解其底层是如何实现的。
让事务管理代码从特定的事务技术中独立出来。
开发人员通过配置的方式进行事务管理,而不必了解其底层是如何实现的。
扩展
Spring并不直接管理事务,而是提供了多种事务管理器,
他们将事务管理的职责委托给Hibernate或者JTA等持久化机制
所提供的相关平台框架的事务来实现。
他们将事务管理的职责委托给Hibernate或者JTA等持久化机制
所提供的相关平台框架的事务来实现。
注解声明式事务管理
案例
1)propagation:事务传播行为
概述
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。
属性
2)ioslation:事务隔离级别
概述
数据库事务并发问题
1)脏读
案例
2)不可重复读
案例
3)幻读
案例
4)读未提交:READ UNCOMMITTED
5)读已提交:READ COMMITTED
6)可重复读:REPEATABLE READ
7)串行化:SERIALIZABLE
8)各个隔离级别解决并发问题的能力
9)各种数据库产品对事务隔离级别的支持程度
3)timeout:超时时间
(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值是 -1 ,设置时间以秒单位进行计算
4)readOnly:是否只读
(1)读:查询操作,写:添加修改删除操作
(2)readOnly 默认值 false,表示可以查询,可以添加修改删除操作
(3)设置 readOnly 值是 true,设置成 true 之后,只能查询
5)rollbackFor:回滚
(1)设置出现哪些异常进行事务回滚
需在事务注解标记的业务方法内部throw异常,才会触发事务回滚;如:
throw new ArithmeticException();
需在事务注解标记的业务方法内部throw异常,才会触发事务回滚;如:
throw new ArithmeticException();
6)noRollbackFor:不回滚
(1)设置出现哪些异常不进行事务回滚
XML 声明式事务管理
完全注解声明式事务管理
0 条评论
下一页