【Policy】使用 InitializingBean 实现策略时如何避免AOP失效

使用InitializingBean实现策略模式

  • 参考策略模式示例中的第一种实现方式.
  • 代码demo项目

不同的注入方式对AOP注解的影响

部分策略代码及测试代码

public interface TraditionOrderService extends InitializingBean {
  // ...
}
@Service
public class TraditionOrderServiceImpl implements TraditionOrderService {
  // afterPropertiesSet 注入方法见后续
}
  • 测试类
@Autowired
private TraditionOrderService traditionOrderService;

InitializingBean invoicePolicyService = InvoicePolicyFactory.getByType(1);

1.使用this注入会导致所有的AOP注解失效

@Override
public void afterPropertiesSet() {
  InvoicePolicyFactory.register(1, this);
}
  1. 实现类无AOP注解的注入结果(推荐)
    无AOP注解的注入结果
  2. 实现类有AOP注解的注入结果
    有AOP注解的注入结果
  • 这种方式给策略工厂注入的对象一定是非反向代理的对象,所以AOP注解都失效.

@Async @Transactional @GdLock @Monitor等注解都会失效

2.使用applicationContext.getBean()注入仅@Async失效

@Autowired
private ApplicationContext applicationContext;
@Override
public void afterPropertiesSet() {
  InvoicePolicyFactory.register(1, applicationContext.getBean(TraditionOrderService.class));
}
  1. 实现类无AOP注解的注入结果
    实现类无AOP注解的注入结果
  2. 实现类只有@Async注解的注入结果
    只有@Async注解的注入结果
  3. 实现类有@Async和其他AOP注解的注入结果
    有@Async和其他AOP注解的注入结果
  4. 实现类无@Async注解的注入结果(推荐)
    实现类无@Async注解的注入结果
  • 没有AOP注解或仅有@Async时,这种方式给策略工厂注入的对象是非反向代理的对象; 否则,注入CGLIB反向代理的对象.所以,@Async外的AOP注解有效.

可以简单的认为@Async注解会失效,其他AOP注解有效.

3.使用@Autowired注入可能仅@Async有效

@Lazy
@Autowired
private TraditionOrderService service;
@Override
public void afterPropertiesSet() {
  InvoicePolicyFactory.register(1, service);
}
  • 这种方式给策略工厂注入的对象一定是JDK反向代理的对象.

可以简单的认为@Async注解有效,其他AOP注解失效.

  1. 实现类无AOP注解的注入结果
    无AOP注解的注入结果
  2. 实现类只有@Async注解的注入结果(推荐)
    只有@Async注解的注入结果
  3. 实现类无异步或混合的注入结果
    无异步或混合的注入结果

总结

没有AOP注解(不需要反向代理)使用任意一种
没有@Async使用第二种
仅有@Async使用第三种

强烈建议把@Async和其他AOP注解进行物理隔离,分别放在不同的实现类中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络知识整合——Web页面请求的历程

Web页面请求的历程 内部涉及知识:一、准备:DHCP、UDP、IP 和以太网二、仍在准备:DNS和ARP三、仍在准备:域内路由选择到DNS服务器四、Web客户-服务器交互:TCP和HTTP五、HTTP请求响应格式Requests部分Responses 部分 下载一个Web页面…

请问如何用oracle触发器实现不允许新增/删除表/增加/减少/修改字段类型

请问如何用oracle触发器实现不允许新增/删除表/增加/减少/修改字段类型 给本帖投票 56211打赏收藏 分享 转发到动态举报 写回复 性能测试中发现oracle11g数据库每天22点,oralce进程CPU占用率突增>> 11 条回复 切换为时间正序 请发表友善的回复… 发表回复 microsof…

【Java项目实战-牛客社区】--idea创建springboot工程

①. 创建springboot工程,并勾选web开发相关依赖。 。配置Maven ②. 定义Controller类,添加方法 hello。 ③. 运行测试1 使用Spring Initializr方式构建Spring Boot项目 Spring Initializr是一个Web应用,它提供了一个基本的项目结构&#xff…

Redis进阶底层原理 - 高可用哨兵模式

Redis哨兵模式是redis实现高可用的一种分布式架构。哨兵节点是一种特殊的Redis实例,它不用于存储业务数据,它主要工作内容如下:(高可用不是指不出问题,而是出了问题后能及时的自动化解决,从而在客户端无感&…

IntelliJ IDEA 版本控制

IntelliJ IDEA 版本控制(VCS)日常使用方法备忘 1、搁置更改 2、移至另一个更改列表 对于工程项目中的配置文件,已经在本地修改但是不能提交,如果在提交项目代码时全选变更的文件,可能会误提交配置文件,此…

【教程】VSCode配置C++环境踩坑记录

时隔一年终于在VSCode配置好了C环境[MinGW] 基础部分踩坑坑0坑1坑2坑3 基础部分 就是安装VSCode,然后再安装C插件之类的,咱这就不罗嗦了,如果不清楚可以参考这篇文章:VSCode配置C/C环境 毕竟解决后面一些棘手的问题更重要。 踩坑…

GreatSQL通过错误日志信息判断数据库实例是如何关闭的

背景概述 在一次客户的数据库实例连接不上了,需要我们排查一下原因,通过查看数据库实例进程已经不存在了,在错误日志中没有发现其他报错信息,发现有shutdown的字样出现,怀疑是某个用户手动关闭了实例。我们通过以下测…

P1403 [AHOI2005] 约数研究

题目描述 科学家们在 Samuel 星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机 Samuel II 的长时间运算成为了可能。由于在去年一年的辛苦工作取得了不错的成绩,小联被允许用 Samuel II 进行数学研究。 小联最近在研究和约数有关的问题&…

Python教程(3)——python开发工具vscode的下载与安装

Python的开发工具有很多款,很多都是非常好用的,其中vscode作为其中一款Python的开发工具,是非常轻量级的,今天我们来介绍一下vs code的下载与安装。 vscode的下载与安装 首先需要到vscode的官网,这个谷歌或者百度一下…

[Java]Set、Map、List常见实现类的特点、使用方法总结

文章目录 1、图谱2、List1、ArrayList1. 特点2. 常见方法 2、LinkedList1、特点2、常见方法 3、Vector1、特点 3、Map1、HashMap1、特点常用方法 2、TreeMap1、特点 3、LinkedHashMap1、特点 4、Set1、HashSet1 、特点2、常用方法 2、LinkedHashSet特点 3、TreeSet1、特点2、使…

Ajax详解

文章目录 1. 概述1.1 Ajax工作原理1.2 Ajax的作用1.3 同步异步 2. 原生Ajax3. Axios3.1 Axios的基本使用3.2 Axios快速入门3.3 请求方法的别名 1. 概述 Ajax 是 “Asynchronous JavaScript and XML”(异步 JavaScript 和 XML)的缩写。它是一种在无需重新…

缓存数据一致性探究

缓存数据一致性探究 缓存是一种较低成本提升系统性能的方式,自它面世第一天起就备受广大开发者的喜爱。然而正如《人月神话》中的那句经典的“没有银弹”中所说,软件工程的设计没有银弹。 就像每一次发布上线修复问题的同时,也极易引入新的问…

蓝牙资讯|三星和日企合作开发智能戒指,将与苹果直接竞争

三星提交了一系列关于可穿戴设备的商标申请,其中包括与智能戒指有关的商标。近日有媒体爆出,三星已经开始与日本印刷电路板企业Meiko合作开发一款智能戒指。据称这款戒指可能会采用Galaxy品牌,或上周申请的智能戒指商标。 目前这一项目处于前…

JavaScript入门——笔记用

JavaScript入门 变量数组常量模板字符串检测数据类型判断分支判断循环数组函数对象 与html和css不同的是js并不是一门标记语言,而是与java等相同,也是一门编程语言(实现人机交互的运行在客户端即浏览器的编程语言) JavaScript作用…

不外传秘诀| docker 快速搭建常用的服务环境

本文主要给大家介绍如何使用 docker 搭建常用的服务环境, 包括mysql,reedis,nginx,jenkins 等常用的环境,下面直接进入主题。 1、MySQL 部署 ①搜索 MySQL 镜像 docker search mysql ②拉取 MySQL 镜像 docker pull mysql:5.7 ③创建容器&#xf…

NAS 问题处理记录

在解决自动配网的过程中,突然NAS不给力,偏偏这个时间找事情。上面这两个问题,说不复杂也不复杂,主要是自己在完全远程处理,很多不方便。当然少不了师弟的助攻,很感谢我的师弟帮忙,实验室的网络不…

JMeter做http接口功能测试

1. 普通的以key-value传参的get请求 e.g. 获取用户信息 添加http请求;填写服务器域名或IP;方法选GET;填写路径;添加参数;运行并查看结果。 2. 以Json串传参的post请求 e.g. 获取用户余额 添加http请求;…

软件测试行业的困境和迷局

中国的软件测试虽然起点较高,但是软件测试的发展似乎没有想象中那么顺利。 其实每个行业除了有自身领域外,还有属于自己的“生态系统”。属于软件测试的生态系统主要包括后备软件测试人员、软件开发人员和软件管理决策者。后备软件测试人员是软件测试的…

python爬虫-获取headers(报文头)关键参数实例小记

注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! 第一步:请求页面,得到响应。建议首次请求时headers内容都带着,调试…

linux开机启动输入法且设置英文状态

debian,gnome桌面。fcitx5框架,四叶草输入法。 首先把fcitx5加到开机启动项,方法很多,gnome的插件“优化”里面可以添加开机启动项。 这样开机就能启动输入法,而不用再手动输入shell命令fcitx5了。 但是启动时是中…
最新文章