文章目录
- AOC概述
- Spring-aop 配置
- 举例快速实现
- 获取切点详细信息
- 在增强方法中获取目标方法的信息
- 返回结果
- 异常信息
- 切点表示式语法
- 统一切点管理
- 环绕通知 @Around
- 切面增强优先级
- CGlib生效场景
- 注解方式aop总结
- xml 方式配置aop
- Spring AOP 对获取Bean的影响
- Spring 声明性事务
- 概念
- 事务管理器和原理
AOC概述
AOC,即面向切面编程,是一种编程思想。
如果说面向对象编程(OOP)是一种纵向的编程思维,AOC则是横向的编程思维。用于Spring中可以弥补OOP存在的不足,例如难以对方法细节进行单独修改而不影响子父类,AOP将所有非核心代码进行统一管理,降低了代码的耦合性。
底层使用代理技术。
Spring-aop 配置
举例快速实现
需求:给计算的业务类添加日志
- 导入依赖
- 正常编写核心业务加入ioc容器
- 编写ioc的配置类和文件
- 测试环境
- 增强类,定义三个增强方法
- 增强类的配置(插入切点的位置,切点指定,切面配置)
- 开启aop的配置
获取切点详细信息
MyAdvice类
- 定义方法-增强代码
- 使用注解指定对应的位置
- 配置切点表达式选中方法
- 切点和ioc的配置
- 开启aspectj注解的支持
在增强方法中获取目标方法的信息
形参 JoinPoint
给需要用到的增强方法添加形参 (JoinPoint joinpoint)
//获取方法属于的类的信息
String simpleName = joinPoint.getTarget().getClass().getSimpleName();
//参数列表等类似
返回结果
@AfterReturning中
形参(Object result)接收返回结果
异常信息
@AfterThrowing中
(Throwable t)
切点表示式语法
固定语法execution(切点表达式)
-
访问修饰符
-
方法返回参数类型
前两位可以整合成一个* -
包的位置
- 单层模糊 .*
- 多层模糊
-
类的名称
-
方法名
-
形参列表
- ()-没有参数
- (…){两个点}-模糊参数:有没有参数都可以
execution(public int com.atguigu.spring.aop.target.Calculator.dir ( int,int ))
统一切点管理
- 当前类中提取
定义一个空方法
注解@Pointcut()
增强注解中引用切点表达式的方法即可 - 创建一个存储切点的类(推荐)
单独维护切点
环绕通知 @Around
环绕方法需要自己在通知中定义目标方法的执行。
- 形参(ProceedingJoinPoint)
- @return 目标方法的返回值
@Around("pc()")
public Object transaction(ProceedingJoinPoint joinPoint){//保证目标方法被执行Object[] args= joinPoint.getArgs();Object result = null;try{System.out.println("开启事务");//增强代码result = joinPoint.proceed(args);}catch(Throwable e){System.out.println("事务回滚");throw new RuntimeException(e);}finally{}return result;
}
切面增强优先级
@Order() 值越小,优先级越高(外圈),越前置先执行,越后置后执行。
CGlib生效场景
没有接口时会从jdk转为cglib。
注解方式aop总结
- 正常写核心方法
- advice类(增强类)
用不同注解对应不同的方法
同样需要@Component和@Aspect - 提取到公共行为的切点 pointcut
- 开启aspectj注解支持
- 如果在配置文件中:<aop:aspectj-autoproxy />
- 如果用配置类:@EnableAspectJAutoProxy
xml 方式配置aop
spring.xml 一般放在resources中
<aop:config><!--声明切点标签@Pointcut--><!--切面配置标签@Aspect--><!--位置指定标签--></aop:config>
Spring AOP 对获取Bean的影响
- 声明一个接口,接口有一个实现类,又有一个切面类应用于实现类。则实际上是代理类在Ioc中,故仅能通过接口获取bean。
- 若无接口,用cglib,则可以用类获取bean。(代理有继承)
Spring 声明性事务
概念
- 编程式事务
编写代码的方式直接控制事务的提交和回滚。会有大量冗余。 - 声明式事务
使用注解或XML配置方式控制事务。
需要第三方框架(Spring-tx)
事务管理器和原理
Spring-tx 是对 Spring-AOP 的再次封装。
事务管理器(接口)用于具体提供事务方法。
- DataSourceTransactionManager
- HibernateTM
- JpaTM
需要:
- 选择一个合适的事务管理器实现加入到ioc容器
- 指定哪些方法需要添加事务即可