Spring简介:
Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发 的复杂性而创建的。Spring 的核心是
控制反转(IoC)和面向切面编程(AOP)
。Spring 是可 以在 Java SE/EE 中使用的轻量级开源框架。
Spring 的主要作用就是为代码“解耦”,降低代码间的耦合度。就是让对象和对象(模 块和模块)之间关系不是使用代码关联,而是通过配置来说明。即在 Spring 中说明对象(模 块)的关系。
Spring 根据代码的功能特点,使用 Ioc 降低业务对象之间耦合度。IoC 使得主业务在相互 调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了。而是由 Spring 容器统一管理,自动“注入”,注入即赋值。 而 AOP 使得系统级服务得到了最大复用,且 不用再由程序员手工将系统级服务“混杂”到主业务逻辑中了,而是由 Spring 容器统一完成 “织入”。
Spring 优点:
轻量、 针对接口编程,解耦合、 AOP 编程的支持、 AOP 编程的支持。
IoC 控制反转:
控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代 码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对 象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值, 依赖的管理。
Spring 框架使用依赖注入(DI)实现 IoC。
A
pplicationContext 接口(容器)
ApplicationContext 用于加载 Spring 的配置文件,在程序中充当“容器”的角色。其实现 类有两个。
![](https://i-blog.csdnimg.cn/blog_migrate/4b1e306d9c0572c2c59e82ad1b4ca0d5.png)
A、配置文件在类路径下 若 Spring 配置文件存放在项目的类路径下,则使用 ClassPathXmlApplicationContext 实现 类进行加载。
![](https://i-blog.csdnimg.cn/blog_migrate/add4b78370e4feaf256aecc5381f8e92.png)
B、 ApplicationContext 容器中对象的装配时机
ApplicationContext 容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。 以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。
![](https://i-blog.csdnimg.cn/blog_migrate/67ebac71cbefc967a3e15e7f5f58b899.png)
C、 使用 spring 容器创建的 java 对象
Di的实现有两种方式:
在Spring中配置文件,叫做基于XML的DI实现。
一种是使用spring中的注解,叫做基于注解实现。
![](https://i-blog.csdnimg.cn/blog_migrate/d1e666375eaf6d4acab17bd601919ee3.png)
基于XML实现:
bean 实例在调用无参构造器创建对象后,就要对 bean 对象的属性进行初始化。初始化 是由容器自动完成的,称为注入。
set基本数据类型注入:
set 注入也叫设值注入是指,通过 setter 方法传入被调用者的实例。这种注入方式简单、 直观,因而在 Spring 的依赖注入中大量使用。
![](https://i-blog.csdnimg.cn/blog_migrate/bfc9a74699cdd82ed62565baeb8d5613.png)
set引用数据类型注入:
当指定 bean 的某属性值为另一 bean 的实例时,通过 ref 指定它们间的引用关系。ref 的值必须为某 bean 的 id 值。
![](https://i-blog.csdnimg.cn/blog_migrate/f71aec52b32d5bc1c1fb1429daf8cc65.png)
构造类型注入:
构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。即,使用构造器设 置依赖关系。
![](https://i-blog.csdnimg.cn/blog_migrate/b8dc06fb3446a681f373fd32f66cb7c3.png)
关于 引用类型属性自动注入
byName 方式自动注入和 byType 方式自动注入
![](https://i-blog.csdnimg.cn/blog_migrate/42707358c321330723e15cbef76aa301.png)
注意:byType中的<bean>符合条件只能有一个,多了会报错
为应用指定多个 Spring 配置文件
多个配置文件中有一个总文件,总配置文件将各其它子文件通过引入。在 Java 代码中只需要使用总配置文件对容器进行初始化即可。
![](https://i-blog.csdnimg.cn/blog_migrate/ebbb6d052b625e40076148001dd91923.png)
![](https://i-blog.csdnimg.cn/blog_migrate/25c8c347e7ef884379288a7a2c8a4861.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c95b09485d10104c1dacf9e7a0daff31.png)
基于注解的实现DI:
需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。
![](https://i-blog.csdnimg.cn/blog_migrate/b0acd609b393e7a522b4d886320a0755.png)
注解的定义:
创建普通类@Component注解,@Repository、@Service、@Controller这三个注解与@Component 都可以创建对象,但这三个注解还有其他的含义, @Repository 用于对 DAO 实现类进行注解 ,@Service 创建业务层对象,业务层对象可以加入事务功能,@Controller 注解创建的对象可以作为处 理器接收用户的请求。
![](https://i-blog.csdnimg.cn/blog_migrate/6fe49b0c0425734aedd4bafaf538ec83.png)
@Value注解
:
需要在属性上使用注解@Value,该注解的 value 属性用于指定要注入的值。
![](https://i-blog.csdnimg.cn/blog_migrate/46adfc41eebf96af5237e10493cde189.png)
byType 自动注入@Autowired
:
用于给引用数据类型的属性赋值,该注解默认使用按类型自动装配 Bean 的方式
![](https://i-blog.csdnimg.cn/blog_migrate/575f8425abba545c30263ec8976cd52b.png)
byName 自动注入@Autowired 与@Qualifier
![](https://i-blog.csdnimg.cn/blog_migrate/3bd243809f38b17ff8394e19da6384dc.png)
JDK 注解@Resource 自动注入
@Resource 注解若不带任何参数,采用默认按名称的方式注入,按名称不能注入 bean, 则会按照类型进行 Bean 的匹配注入。
![](https://i-blog.csdnimg.cn/blog_migrate/fa256d0a9252c7c39451190286162d9d.png)
AOP 面向切面编程:
AOP 简介
AOP(Aspect Orient Programming),面向切面编程。面向切面编程是从动态角度考虑程 序运行过程。 AOP 底层,就是采用动态代理模式实现的。采用了两种代理:JDK 的动态代理,与 CGLIB 的动态代理。
面向切面编程对有什么好处?
1.减少重复;
2.专注业务;
注意:面向切面编程只是面向对象编程的一种补充。 使用 AOP 减少重复代码,专注业务实现:
![](https://i-blog.csdnimg.cn/blog_migrate/bafab81ba507bcb459002db46e553831.png)
AOP 编程术语:
1) 切面(Aspect) 切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面 是通知(Advice)。实际就是对主业务逻辑的一种增强。
2) 连接点(JoinPoint) 通常业务接口中的方法均为连接点。
3) 切入点(Pointcut) 切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法,就是多个JoinPoint。
4) 目标对象(Target) 目 标 对 象 指 将 要 被 增 强 的 对 象 。
给哪个类的方法增加功能, 这个类就是目标对象。
5) 通知(Advice) 通知表示切面的执行时间,Advice 也叫增强。
AspectJ 对 AOP 的实现:
AspectJ是一个开源的专门做aop的框架。spring框架中集成了aspectj框架,通过spring就能使用aspectj的功能。
aspectJ框架实现aop有两种方式:
1.使用xml的配置文件 : 配置全局事务
2.使用注解,我们在项目中要做aop功能,一般都使用注解, aspectj有5个注解。
@Aspect
是aspectj框架中的注解。
* 作用:表示当前类是切面类。
* 切面类:是用来给业务方法增加功能的类,在这个类中有切面的功能代码
* 位置:在类定义的上面
AspectJ 中常用的通知有五种类型:
(1)前置通知 @Before
(2)后置通知 @AfterReturning
(3)环绕通知 @Arount
(4)异常通知 @AfterThrowing
(5)最终通知 @After
AspectJ 的切入点表达式:
execution(访问权限 方法返回值 方法声明(参数) 异常类型)
AspectJ使用步骤:
1.定义切面类使用@Aspect注解
![](https://i-blog.csdnimg.cn/blog_migrate/75b240ec26382737f7055e10427c4fce.png)
2.表示切面执行的位置(目标类执行的位置),使用的是切入点表达式。使用的是前置通知 ]@Before 前置通知-方法有 JoinPoint 参数
![](https://i-blog.csdnimg.cn/blog_migrate/f728453bf5b9994fc9e5bd78732f8aa4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/36f8d6a37f61dc08cbc38bfaf68a8c10.png)
注册 AspectJ 的自动代理: 只需要在 Spring 配置文件中注册一个基于 aspectj 的 自动代理生成器,其就会自动扫描到@Aspect 注解,并按通知类型与切入点,将其织入,并 生成代理。
![](https://i-blog.csdnimg.cn/blog_migrate/8b43674339336433472bb92e832da870.png)
@Around 环绕通知-增强方法有 ProceedingJoinPoint 参数:
在目标方法执行之前之后执行。被注解为环绕增强的方法要有返回值
,Object 类型。并 且方法可以包含一个 ProceedingJoinPoint 类型的参数。
![](https://i-blog.csdnimg.cn/blog_migrate/7e557b010a00f2e7b7b306e574d85ce3.png)
注:后置通知、异常通知等功能类似
关于Spring-Mybatis的集成
![](https://i-blog.csdnimg.cn/blog_migrate/1bb298a3be78e35746161ed581f50d54.png)
Spring 事务
spring提供一种处理事务的统一模型, 能使用统一步骤,方式完成多种不同数据库访问技术的事务处理。
-使用spring的事务处理机制,可以完成mybatis访问数据库的事务处理
-使用spring的事务处理机制,可以完成hibernate访问数据库的事务处理。
事务定义接口 TransactionDefinition 中定义了事务描述相关的三类常量:
事务隔离级别、 事务传播行为、事务默认超时时限,及对它们的操作。
事务的隔离级别:有4个值。
DEFAULT:采用 DB 默认的事务隔离级别。
MySql 的默认为 REPEATABLE_READ;
Oracle默认为READ_COMMITTED。
➢ READ_UNCOMMITTED:读未提交。未解决任何并发问题。
➢ READ_COMMITTED:读已提交。解决脏读,存在不可重复读与幻读。
➢ REPEATABLE_READ:可重复读。解决脏读、不可重复读,存在幻读
➢ SERIALIZABLE:串行化。不存在并发问题。
事务的超时时间:
表示一个方法最长的执行时间,如果方法执行时超过了时间,事务就回滚。
单位是秒, 整数值, 默认是 -1.
事务的传播行为 :
控制业务方法是不是有事务的, 是什么样的事务的。
7个传播行为,表示你的业务方法调用时,事务在方法之间是如果使用的。
PROPAGATION_REQUIRED
:
指定的方法必须在事务内执行。若当前存在事务,就加入到当前事务中;若当前没有事 务,则创建一个新事务。这种传播行为是最常见的选择,也是 Spring 默认的事务传播行为。
PROPAGATION_REQUIRES_NEW
:总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。
PROPAGATION_SUPPORTS
: 指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。
以上三个需要掌握的
PROPAGATION_MANDATORY
PROPAGATION_NESTED
PROPAGATION_NEVER
PROPAGATION_NOT_SUPPORTED
事务提交事务,回滚事务的时机:
1)当你的业务方法,执行成功,没有异常抛出,当方法执行完毕,spring在方法执行后提交事务。事务管理器commit
2)当你的业务方法抛出运行时异常或ERROR, spring执行回滚,调用事务管理器的rollback
运行时异常的定义: RuntimeException 和他的子类都是运行时异常, 例如NullPointException , NumberFormatException
3) 当你的业务方法抛出非运行时异常, 主要是受查异常时,提交事务
受查异常:在你写代码中,必须处理的异常。例如IOException, SQLException
使用 Spring 的事务注解管理事务
使用@Transactional的步骤:通过@Transactional 注解方式,可将事务织入到相应 public 方法中,实现事务管理。
1.声明事务管理器和事务注解驱动
![](https://i-blog.csdnimg.cn/blog_migrate/9325e6403c192a3ed5fe964d48b59854.png)
2.在业务逻辑代码service类中的方法上加上@Transactional注解,注解的所有可选属性如下所示:
➢ propagation:用于设置事务传播属性。该属性类型为 Propagation 枚举,默认值是Propagation.REQUIRED。
➢ isolation:用于设置事务的隔离级别。该属性类型为 Isolation 枚举,默认值为 Isolation.DEFAULT。
➢ readOnly:用于设置该方法对数据库的操作是否是只读的。该属性为 boolean,默认值 为 false。
➢ timeout:用于设置本操作与数据库连接的超时时限。单位为秒,类型为 int,默认值为 -1,即没有时限。
➢ rollbackFor:指定需要回滚的异常类。类型为 Class[],默认值为空数组。当然,若只有 一个异常类时,可以不使用数组。
![](https://i-blog.csdnimg.cn/blog_migrate/3579609f2bc9102551ec42199c07f0a1.png)
使用 AspectJ管理事务
适合大型项目,有很多的类,方法,需要大量的配置事务,使用aspectj框架功能,在spring配置文件中
声明类,方法需要的事务。这种方式业务方法和事务配置完全分离。
实现步骤:
1.要使用的是aspectj框架,需要加入依赖
2.声明事务管理器对象
3.声明方法需要的事务类型(配置方法的事务属性【隔离级别,传播行为,超时】)
4.配置aop:指定哪些哪类要创建代理。
![](https://i-blog.csdnimg.cn/blog_migrate/5fb7b8d706cf6561dfa61d790a697943.png)
------------------------------>所学来自动力节点王老师