java - 都说声明式事务管理是基于AOP的 但是我不明白 我调用我的代码 spring是怎么插一杠子 加上事务的

 淡泊宁静1110 发布于 2022-10-26 19:30

Spring提供的事务管理有两种方式,编程式的和声明式的. 编程式的繁琐,我一般不喜欢用.
最喜欢的一种是利用Spring封装的aspectJ, 利用Aop来管理事务很方便的.

applicationcontext.xml
1首先创建一个事务管理器

  
  

2声明一个通知, 并声明此通知受某一个事务管理器管理





上面的一段话说明了txAdvice受transactionManager事务管理器管理, 并且管理save打头的方法. 其余的都不使用事务管理.

3最后利用advisor配置advice的切入点.

           pointcut="execution(pulic * *..*.service.*.*(..))">  


这样, 只要经过service层就会进入事务管理.
(begin - save - commit)动态代理

我想问为什么 经过service层就会进入事务管理 别说动态代理 具体是怎么做的

6 个回答
  • 前面几位基本都回答了,AOP的底层实现就是设计模式的代理模式,建议去了解下这种设计模式

    2022-11-12 01:40 回答
  • 前段时间刚好写过一篇文章,《Spring AOP的实现原理》。

    2022-11-12 01:40 回答
  • 关键字:动态代理.多学习如何利用搜索引擎获取知识

    2022-11-12 01:40 回答
  • 我想这个问题的关键在于理解AOP上。

    面向切面(AOP)的实现很大程度上依赖的是控制扭转(IOC),这两个概念就不详细说了,百度一下都能找到。

    关键点在于控制扭转上,正常的程序控制是有由你,也就是编程者进行的。而控制扭转后,实际上程序的控制着是实现控制扭转的框架,这里就是Spring。所以你有一个很关键的误解,就是我调用我的代码。实际上调用你代码的不是你,而是框架,既然调用你程序的是框架,那它自然就有机会去查询你的代码里是否有面向切面的配置,如果有,它也有机会去执行这些配置。

    2022-11-12 01:40 回答
  • 讲的白话一点就是在运行时在你的程序前后增加了事务的代码。
    这个很好理解,你可以试试如果你的bean对象没有放置在ioc容器中管理时是不会有事务控制的。
    为什么spring提倡面向接口编程呢,其实就是在程序运行时,动态生成接口的子类,在di依赖注入时的对象是由spring动态生成的(代理对象),而不是你创建的那个bean。在生成的代码中调用实际的bean对象,在前面增加公共的代码。
    打个断点看看线程堆栈一目了然。

    2022-11-12 01:40 回答
  • 真正跑的实例对象已经不是你写的那个类的对象了,它加了一层壳,而这个壳就有执行额外代码的功能,比如事务管理,这层壳是spring根据配置帮你加上去的。这就是aop带来的好处,你写了核心代码,然后写一个额外的功能代码(增强),你要把它放到功能代码里执行,spring会帮你动态的织入放配置的切点而你无需去修改的的核心代码,哪里不会点哪里,麻麻再也不用担心耦合度高了!
    你可以了解一下动态代理的知识,你就明白了。如果不理解这样的好处,等你代码写多了就知道了

    2022-11-12 01:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有