Spring AOP注解为什么失效?90%Java程序员不知道

转载自 Spring AOP注解为什么失效?90%Java程序员不知道

使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效。

如下面几种场景

1、Controller直接调用Service A方法:Controller > Service A  Method

在Service A 上加@Transactional的时候可以正常实现AOP功能。

 

2、Controller调用Service A方法,A再调用B方法:Controller > Service A Method > Service B Method

在Service B Method上加@Transactional的时候不能实现AOP功能,因为在Service A方法中调用Service B方法就是使用this.B(),this代表的是Service类本身,并不是真实的代理Service对象,所以这种不能实现代理功能。

所以,如果不是直接调用的方式,是不能实现代理功能的,非常需要注意。

但确实有这种不是直接调用的试,也需要实现代理功能,怎么做呢?很简单,只需要暴露当前代理对象给当前线程就行了,如下配置,注解粗体的部分。

<!-- aspect -->
<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>
protected final T proxy() {return (T) AopContext.currentProxy();
}

这样就能拿到代理对象了,在Service A中可以通过proxy().B()即可正常实现B方法上面的代理功能。

看下AopContext源码,Spring会将当前代理对象绑定到当前线程ThreadLocal上面。

关于线程绑定变量参考昨天分享的ThreadLocal文章。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis多表新增如何获取主键ID

记录一下碰到的问题&#xff0c;就当做是笔记吧&#xff0c;防止忘记。在做ssm多表新增的时候&#xff0c;碰到了一个小问题&#xff0c;就是在新增成功一个表的时候我要获取它的ID&#xff0c;然后用它的ID新增下一个表。 但是&#xff0c;我要怎么做呢&#xff1f;新增成功&a…

React 相关的优秀资源

转自&#xff1a; https://github.com/ywwhack/react-journey React 相关的优秀资源 以下列出的资源主要来自自己学习react过程中看过的觉的不错的文章、教程&#xff0c;也算是一个学习过程的记录。 React 教程 名称简介fullstackreact如果只看一个react教程&#xff0c;…

Spring import配置文件使用占位符

转载自 Spring import配置文件使用占位符 import使用占位符 连接池切换导入配置的代码&#xff1a; <import resource"classpath:META-INF/spring/spring-${db.connection.pool}.xml" /> 在配置文件添加配置 db.connection.pooldruid 启动直接报错&#xff0c;…

i18n国际化登录页面

国际化是啥&#xff0c;一开始我也是一脸懵逼。了解了之后才知道&#xff0c;原来它相当于网站的翻译按钮。毕竟世界上有很多不同的语言&#xff0c;不可能每个人都会中文嘛&#xff0c;所以它的作用就体现出来了。 国际化又被称为i18n&#xff0c;因为internationalization(国…

react书籍推荐

转自&#xff1a; https://blog.csdn.net/xutongbao/article/details/88638078 React全栈.pdf 链接&#xff1a;https://pan.baidu.com/s/10Qzn8uTTKPVCfJ7R4FKYLQ 提取码&#xff1a;pcfj 深入React技术栈.pdf 链接&#xff1a;https://pan.baidu.com/s/1c5kQbrQNMxAkyIurjG…

Java 9 新特性概述

转载自 Java 9 新特性概述Java 9 正式发布于 2017 年 9 月 21 日 。作为 Java8 之后 3 年半才发布的新版本&#xff0c;Java 9 带 来了很多重大的变化。其中最重要的改动是 Java 平台模块系统的引入。除此之外&#xff0c;还有一些新的特性。 本文对 Java9 中包含的新特性做了概…

基于脚手架创建react项目

React&#xff08;一&#xff09;使用脚手架创建React项目&#xff1a; 转自&#xff1a; https://www.cnblogs.com/yulingjia/p/9583244.html D:\workbench_ws>npm install -g create-react-app C:\Users\pacoson\AppData\Roaming\npm\create-react-app -> C:\Users\pac…

使用Git前的准备工作

版本控制&#xff08;Revision control&#xff09;是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。 简单来说&#xff0c;版本控制就是用于管理多人协同开发项目的…

Servlet 工作原理解析

转载自 Servlet 工作原理解析从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚&#xff0c;Servlet 与 Servlet 容器的关系有点像枪和子弹的关系&#xff0c;枪是为子弹而生&#xff0c;而子弹又让枪有了杀伤力。虽然它们是彼此依存的&#xff0c;但是又相互…

Git分支如何使用

上次写了使用Git前的准备工作&#xff0c;现在我来记录一下git分支功能是如何使用的。 Git分支相当于你的一个分身&#xff0c;你让你的分身去学习英语&#xff0c;然后你自己去学数学&#xff0c;等到你的分身学会了英语&#xff0c;你就让它回归你的身体里&#xff0c;这样你…

ES6模板字符串【${}配合反单引号一起用】

转自&#xff1a; https://www.cnblogs.com/shihuc/p/10238511.html 先看看JavaScript中两个字符串的效果&#xff0c;就很容易知道模板字符串是个啥东西&#xff0c;其实一点也不新鲜。高级编程中&#xff0c;例如java里面的string.format就是干这个事情&#xff0c;诸如此类…

通过实例理解 JDK8 的 CompletableFuture

转载自 通过实例理解 JDK8 的 CompletableFuture 前言 Java 5 并发库主要关注于异步任务的处理&#xff0c;它采用了这样一种模式&#xff0c;producer 线程创建任务并且利用阻塞队列将其传递给任务的 consumer。这种模型在 Java 7 和 8 中进一步发展&#xff0c;并且开始支持…

2021-10-24

今天考试结束&#xff0c;顺便来白漂个徽章&#xff0c;嘿嘿

ES6箭头函数总结

转自&#xff1a; https://www.cnblogs.com/mengff/p/9656486.html 1. 箭头函数基本形式 let func &#xff08;num) > num; let func () > num; let sum (num1,num2) > num1 num2; [1,2,3].map(x > x * x); 2. 箭头函数基本特点 (1). 箭头函数this为父作…

Spring bean - scope详解

转载自 Spring bean - scope详解 Scope是定义Spring如何创建bean的实例的。 在创建bean的时候可以带上scope属性&#xff0c;scope有下面几种类型。 Singleton 这也是Spring默认的scope&#xff0c;表示Spring容器只创建一个bean的实例&#xff0c;Spring在创建第一次后会缓存起…

Invalid bound statement (not found):出现的原因和解决方法

解决错误的步骤出现了什么错误可能导致的原因解决办法出现了什么错误 错误截图&#xff1a; //BindingException 数据绑定异常 not found 找不到 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.kuan.edu.mapper.CourseMapper.getP…

es6箭头函数(墙裂推荐)

转自&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions 箭头函数表达式的语法比函数表达式更简洁&#xff0c;并且没有自己的this&#xff0c;arguments&#xff0c;super或 new.target。这些函数表达式更适用于那…

使用腾讯云发送短信API接口实现(完整流程)

步骤一、开通腾讯云短信服务二、申请签名前的准备&#xff08;申请公众号&#xff09;三、创建签名和模板四、腾讯云API实现发送短信五、使用springboot进行调用六、可能会报的错误一、开通腾讯云短信服务 在腾讯云官网找到短信服务&#xff0c;开通 二、申请签名前的准备&a…

获取Spring的ApplicationContext的几种方式

转载自 获取Spring的ApplicationContext的几种方式 Application Context定义 简单来说就是Spring中的高级容器&#xff0c;可以获取容器中的各种bean组件&#xff0c;注册监听事件&#xff0c;加载资源文件等功能。 具体定义可以参考官网&#xff1a;https://spring.io/underst…