Spring之AOP
Spring AOP介绍#
本质上就是反射,动态代理
必须要有接口,如果没有接口,不能使用,这种方式使用jdk提供的reflect包下的类
但是在生产环境中不能保证每个类都有实现的接口,所以有第二种cglib
cglib在实现的时候有没有接口都无所谓
核心概念及术语#
模型#
AOP通知类型#
开启包的扫描
开启aop的注解功能
cglib早期比动态代理快,现在二者速度差不多
两种通配符#
* 匹配方法#
- 匹配一个或者多个字符
- 只能匹配一层路径,不能匹配多个路径
- 不能够匹配访问修饰符
- 返回值可以用*来代替
. 匹配参数#
代替所有
execution(**(..))
execution(* com..*(..))
在使用表达式的时候,支持逻辑运算, && || !,
execution(public int com.test.service.MyCalculator.*(..) && execution(* *(..))) execution(public int com.test.service.MyCalculator.*(..) || execution(* *(..))) !execution(public int com.test.service.MyCalculator.add(..))
通知方法在定义的时候有没有特殊的要求#
通知方法在定义的时候对于方法内修饰符,返回值类型都没有明确要求
但要注意,参数不能随便添加
多个匹配的表达式相同,能否做抽象#
定义一个无返回值的空方法,给该方法添加@PointCut注解,后续使用可以直接调用方法名称
此处方法只起一个声明作用,能够提供内部其他方法进行调用
环绕通知在执行的时候是优先于普通通知的
如果是正常结束,顺序是:
- 环绕前置通知
- @Before
- 环绕后置通知
- 环绕返回通知
- @After
- @AfterReturning
如果是异常结束,顺序是:
- 环绕前置通知
- @Before
- 环绕异常通知
- 环绕返回通知
- @After
- @AfterThrowing
应用程序中包含多个切面类的时候,决定的执行顺序
按照切面类的名称的首字母进行排序操作,按照字典序,可以在切面类添加@Order注解
同时可添加具体的值,值越小越优先
XML方式#
beans从官方文档里面粘贴
<bean id="logUtil" class="com.test.util.logUtil"></bean> <bean id="securityUtil" class="com.test.util.securityUtil"></bean> <bean id="myCalculator" class="com.test.service.myCalculator"></bean> <aop:config> <aop:aspect ref="logUtil"> <aop:before method="start" pointcut="execution(Integer com.test.service.myCalculator.*(..))"></aop:before> <aop:after></aop:after> </aop:aspect> </aop:config>
声明式事务的简单配置#
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> <!--配置事务管理器的bean对象--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.dataSourceTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> <!--开启基于注解的事务管理器的配置--> <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
public class BookService{ @Autowired private BookDao bookDao; @Transactional public void buyBook(){ bookDao.getPrice(1); bookDao.updateBalance("张三", 100); bookDao.updateBalance(1); } }
propagation:传播特性,表示不同的事务之间执行的关系#
isolation:隔离级别,4种隔离级别,会引发不同的错乱问题#
- timeout:超时时间,表示事务需要花费的时间是多久
- readonly:只读事务,如果配置了只读事务,那么在事务运行期间,不允许对数据进行修改,否则抛出异常
- noRollBackfor:设置不回滚的异常
- noRollbackForClassName:设置回滚的异常
- rollBackfor
- rollbackForClassName
设置超时时间#
@Transactional(timeout = 4),超时时间4s
设置不回滚的异常#
@Transactional(noRollbackFor = {ArithmeticExcepton.class})
@Transactional(noRollbackFor = {"java.lang.ArithmeticExcepton"})
设置回滚的异常#
@Transactional(RollbackFor = {FileNotfoundExcepton.class})
@Transactional(rollbackForClassName = {"java.io.FileNotFoundException"})
隔离级别#
@Transactional(isolation = Isolation.DEFAULT)
@Transactional(isolation = Isolation.READ_COMMITTED)
@Transactional(isolation = Isolation.REPEATABLE_READ)
@Transactional(isolation = Isolation.SERIALIZABLE)
事务的传播特性#
@Transactional(propagation = Propagation.REQUIRED)
@Transactional(propagation = Propagation.REQUIRED_NEW)
@Transactional(propagation = Propagation.SUPPORTS)
@Transactional(propagation = Propagation.NOT_SUPPORTS)
@Transactional(propagation = Propagation.MANDATORY)
@Transactional(propagation = Propagation.NEVER)
@Transactional(propagation = Propagation.NESTED)
REQUIRED,REQUIRES_NEW,NESTED问的比较多,REQUIRES_NEW用的多
总结#
作者:BigBender
出处:https://www.cnblogs.com/BigBender/p/14233334.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-01-05 微分不等式
2020-01-05 零点问题
2020-01-05 2019英语一 Text4分析
2020-01-05 A1065. A+B and C(64bit)
2020-01-05 A1046. Shortest Distance