JAVA学习笔记DAY8——Spring_AOC Spring-tx

发布于:2024-06-18 ⋅ 阅读:(210) ⋅ 点赞:(0)

AOC概述

AOC,即面向切面编程,是一种编程思想。

如果说面向对象编程(OOP)是一种纵向的编程思维,AOC则是横向的编程思维。用于Spring中可以弥补OOP存在的不足,例如难以对方法细节进行单独修改而不影响子父类,AOP将所有非核心代码进行统一管理,降低了代码的耦合性。

底层使用代理技术。

Spring-aop 配置

举例快速实现

需求:给计算的业务类添加日志

  1. 导入依赖
  2. 正常编写核心业务加入ioc容器
  3. 编写ioc的配置类和文件
  4. 测试环境
  5. 增强类,定义三个增强方法
  6. 增强类的配置(插入切点的位置,切点指定,切面配置)
  7. 开启aop的配置

获取切点详细信息

MyAdvice类

  1. 定义方法-增强代码
  2. 使用注解指定对应的位置
  3. 配置切点表达式选中方法
  4. 切点和ioc的配置
  5. 开启aspectj注解的支持

在增强方法中获取目标方法的信息

形参 JoinPoint
给需要用到的增强方法添加形参 (JoinPoint joinpoint)

//获取方法属于的类的信息
String simpleName = joinPoint.getTarget().getClass().getSimpleName();
//参数列表等类似

返回结果

@AfterReturning中
形参(Object result)接收返回结果

异常信息

@AfterThrowing中
(Throwable t)

切点表示式语法

固定语法execution(切点表达式)

  1. 访问修饰符

  2. 方法返回参数类型
    前两位可以整合成一个*

  3. 包的位置

    • 单层模糊 .*
    • 多层模糊
  4. 类的名称

  5. 方法名

  6. 形参列表

    • ()-没有参数
    • (…){两个点}-模糊参数:有没有参数都可以
execution(public int com.atguigu.spring.aop.target.Calculator.dir ( int,int ))

统一切点管理

  1. 当前类中提取
    定义一个空方法
    注解@Pointcut()
    增强注解中引用切点表达式的方法即可
  2. 创建一个存储切点的类(推荐)
    单独维护切点

环绕通知 @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总结

  1. 正常写核心方法
  2. advice类(增强类)
    用不同注解对应不同的方法
    同样需要@Component和@Aspect
  3. 提取到公共行为的切点 pointcut
  4. 开启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

需要:

  1. 选择一个合适的事务管理器实现加入到ioc容器
  2. 指定哪些方法需要添加事务即可

网站公告

今日签到

点亮在社区的每一天
去签到