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


    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注解支持
      • 如果在配置文件中:
      • 如果用配置类:@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. 指定哪些方法需要添加事务即可
  • 相关阅读:
    如何在 Ubuntu 上部署 ONLYOFFICE 协作空间社区版?
    趣味算法------开灯问题
    华为机试真题 C++ 实现【探索地块建立】【2022.11 Q4 新题】
    【枚举区间+线段树】CF Ehu 152 E
    Android 内存泄漏
    Java安全之CC2
    [C++]多态(上)
    [每周一更]-(第13期):灰度测试的解释说明
    SSH基于SSH的HR人事管理系统
    五款功能强大的国产软件,常常被误认为是外国人开发的
  • 原文地址:https://blog.csdn.net/weixin_47227105/article/details/139749033