【Spring框架】揭秘AOP面向切面编程以及Spring事务管理

目录

▐ AOP概述

▐ AOP的基础概念

▐ Spring AOP实现

▐ Spring事务管理


Spring家族文章传送门:Spring框架:开发者的得力伙伴,魅力何在?-CSDN博客

▐ AOP概述

 •  AOP是OOP的延续,是软件开发中的一个热点,是java开发中的一个重要内容。 

 •  AOP(Aspect Oriented Programming)意为 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。

 •  利用AOP可以对业务逻辑和非业务逻辑进行隔离,从而使得各部分之间的 耦合度降低,提高程序的可重用性,同时提高了开发的效率。

面向切面编程的好处就是:减少重复, 专注业务

精粹提炼:

AOP(Aspect Oriented Programming)意为 面向切面编程。面向切面编程是对面向对象编程的补充延续。面向切面编程思想是将程序中非业务代码(像提交事务,打印日志,权限验证,统一异常处理)提取分离出来,然后在调用业务代码时,通过一个代理对象帮助我们调用这些提取出来的非业务代码,这样,在业务代码不用显示的调用非业务代码,做到了业务代码和非业务代码的分离,降低耦合度。

原理:动态代理模式(给业务代码生成代理对象)

📍AOP编程思想是Java中的,不是spring专有的,只是spring使用AOP这一编程思想

▐ AOP的基础概念

连接点:类中可以被增强的方法(可以加功能的方法)

切入点:类中实际被增强的方法

通知:一个切面在特定的连接点要做的事情(方法被增强的功能),分为前置通知、后置通知、异常

目标:代理的目标类,也就是连接点和切入点所在的类

代理:向目标对象 应用通知时 创建的代理对象

▐ Spring AOP实现

这里以注解方式为例:

1. 引入 Spring Aspects 依赖

        <!--aspectj-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

 2. 在Spring配置文件中开启自动代理

    <!--开启自动代理-->
    <aop:aspectj-autoproxy />

3. 在通知的类上添加注解:@Component@Aspect

通知类型: 

•  @Before( ):前置通知,在业务方法执行之前调用执行

•  @After( ):后置通知,在业务方法执行完后调用执行,即使业务代码中出现了异常也会执行

•  @AfterReturning( ):返回通知,在业务方法执行完后调用执行,但当业务代码中出现了异常,不会执行

•  @AfterThrowing( ):异常通知,在业务代码出现异常时执行

  @Around( ):环绕通知,可以在业务方法执行之前, 之后, 出异常时添加功能  (四合一)

📍环绕通知示例: 

    @Around(value = "execution(* com.ffyc.springpro.dao.AdminDao.*(..))")
    public void around(ProceedingJoinPoint joinPoint){
        //前置通知
        System.out.println("前置通知");
        try {
            Object proceed = joinPoint.proceed();//调用目标业务方法
            //返回通知
            System.out.println("返回通知");
        }catch (Throwable throwable){
            throwable.printStackTrace();
            //异常通知
            System.out.println("异常通知");
        }
        //后置通知
        System.out.println("后置通知");
    }

📍异常通知实例:

    @AfterThrowing(value = "execution(* com.ffyc.springpro.dao.AdminDao.*(..))",throwing = "throwable")
    public void exception(Throwable throwable){
        System.out.println("系统忙!");
        System.out.println("异常原因:"+throwable.getMessage());
    }

▐ Spring事务管理

事务管理本质上是数据库提供的一种管理机制

Spring事务管理是Spring框架对事物提交这一功能进行封装,程序员在业务的开发中不需要显示的提交事务

数据库事务管理是对一次数据库操作过程中执行的多条sql语句进行管理,确保一次操作过程中的多条sql要么都执行成功,要么都不执行,从而保证数据的一致性。

Spring中事务管理的两种形式:

编程式事务管理:

在项目中很少使用,这种方式需要注入一个事务管理对象TransactionTemplate,然后在我们代码中需要提交事务或回滚事务时自己写代码实现。

声明式事务管理:

声明式事务底层使用了AOP思想,可以为方法添加事务功能,它的控制是方法级别的

1. 配置Spring事物管理器:

    <!--配置Spring事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

2. 开启注解事务管理:

    <!-- 开启注解事务管理 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

📍如图所示: 

3. 在需要管理的类/方法上添加@Transactional注解标签即可

如果添加到类上面,此类中所有的方法都在Spring事物管理中进行。通常加在service层

声明式事务不生效的场景:

•  @Transactional 应用在非 public 修饰的方法上

•  异常被catch捕获导致失效

•  出现编译期异常   

•  数据库引擎不支持事务

在注解中加 rollbackFor = Exception.class  这样所有的异常都会回滚(第三点的解决方法)

mysql中只有innodb引擎支持事务

                                                                                                               (欢迎大家与我交流)

 关注作者,带你领略更多Spring框架的魅力所在!持续更新中......      博主微信:g2279605572




 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见 

 

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值