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

news2024/11/25 1:02:35

使用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.coloradmin.cn/o/770823.html

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

相关文章

原生信息流广告APP应用内增收及计费模式

比起传统的广告宣传,信息流最大的优势就在于流量的庞大。与此同时,多样化的信息流广告形式和精准的定向,还可以帮助广告主准确获取意向流量。此外,它的广告形式不强迫推送,因此也受到了广泛用户的支持和青睐。 原生信…

Java:输入与输出

目录 输入输出args 输入Scanner 输入格式化输出文件输入与输出 输入输出 args 输入 利用main函数中的参数args,当然也可以起别的名字。其他语言也是一样的。输入时空格分隔。 args的作用:在程序启动时可以用来指定外部参数 Scanner 输入 需要import j…

26.JavaWeb-SpringSecurity安全框架

1.SpringSecurity安全框架 Spring Security是一个功能强大且灵活的安全框架,它专注于为Java应用程序提供身份验证(Authentication)、授权(Authorization)和其他安全功能。Spring Security可以轻松地集成到Spring框架中…

Docker高级——网络配置

Docker网络 默认网络 安装 Docker 以后,会默认创建三种网络,可以通过 docker network ls 查看 [roottest ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 6f24f7cbfa10 bridge bridge local 2dc34a1c0f04 host host…

微信号长期没有使用或被回收?

7月17日,有网友表示自己之前申请了一个辅助账号作为树洞使用,如今登录的时候,弹出文字提示称“该微信号由于长期没有使用已被回收”。 腾讯客服回应表示,正常登录使用的微信号不会被系统回收,但对于长时间未登录的微信…

简用前后端的JSON格式注解:@DateTimeFormat、@JsonFormat、@JsonProperty

JsonFormat 【后端到前端】 在实体类属性上面使用JsonFormat注解了,要注意的是,它只会在声明返回类型为json时,比如使用ResponseBody返回json数据的时候,才会返回格式化的yyyy-MM-dd HH:mm:ss时间,如果直接使用Syste…

【分布式系统案例课】查询服务设计、计数栈选型、总结

查询服务设计 数据获取路径 两个问题考虑: 1、老数据归档的问题。 如果所有分钟小时级的数据一直存在这个DB当中,那么DB的存储空间会被不断的消耗,性能也会不断的下降。所以一旦小时天月的数据聚合完成,我们就可以将一些老的原始…

java: 错误: 不支持发行版本 5 java: 错误: 不支持发行版本8 java: 错误: 不支持发行版本17

🍓🍓原因 该错误表示你使用的Java编译器不支持Java 5版本的发行。Java版本的发行是根据不同的功能和语言变化来区分的。 要解决这个问题,你可以尝试以下几种方法: 检查编译器配置:确保你的IDE或编译器已正确配置为使…

Segment Tree 线段树算法(java)

线段树算法 Segment Tree 线段树算法代码演示 蓄水池算法 Segment Tree 线段树算法 什么是线段树算法: 线段树(Segment Tree)是一种基于树结构的数据结构,用于解决区间查询问题,例如区间最大值、最小值、区间和等。线段…

【数据结构】图解八大排序(下)

文章目录 一、前言二、快速排序1. hoare 版2. 挖坑法3. 前后指针法4. 快排的非递归实现5. 时空复杂度分析 三、归并排序1. 递归实现2. 非递归实现 四、计数排序 一、前言 在上一篇文章中,我们已经学习了五种排序算法,还没看过的小伙伴可以去看一下&…

C语言 —— 浮点类型详解及 IEEE754 规定

【C语言趣味教程】(3) 浮点类型:单精度浮点数 | 双精度浮点型 | IEEE754 标准 🔗 《C语言趣味教程》👈 猛戳订阅!!! ​—— 热门专栏《维生素C语言》的重制版 —— 💭 写在前面:这是…

Paragon NTFS2023中文最新版mac读写NTFS移动硬盘

当我们使用macOS系统将数据拷贝或写入NTFS格式磁盘时,却发现不能操作成功。搜索原因或解决方案时,许多网友推荐安装磁盘管理软件——Paragon NTFS for Mac。 往往大家都会有两个疑问,一是为什么非要使用NTFS格式的磁盘?二是为什么…

C/C++程序内存区域划分以及各区域的介绍

C/C程序内存区域划分 直接上图: 在这里插入图片描述 注:以下的说明均已VS2019为例 栈区(stack) 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元会自动释放。栈内…

用自己的数据拟合Sigmoid函数(Matlab平台)

%% 拟合sigmoid曲线 sigmoid (params, x) params(1) ./ (1 exp(-params(2) .* (x - params(3)))) params(4); %params(1) 是斜率参数,params(2) 是增长速率参数,params(3) 是 x 值的偏移参数,params(4) 是 y 值的偏移参数。 initialGuess…

剑指offer刷题笔记--Num51-60

1--数组中的逆序对&#xff08;51&#xff09; 主要思路&#xff1a; 基于归并排序&#xff0c;视频讲解参考&#xff1a;数组中的逆序对 #include <iostream> #include <vector>class Solution { public:int reversePairs(std::vector<int>& nums) {if(…

【力扣算法17】之 19. 删除链表的倒数第 N 个结点 python

文章目录 问题描述示例1示例2示例3提示 思路分析代码分析完整代码详细分析运行效果截图完结 问题描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例1 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例2…

加强安全防护,提升日志管理——探索EventLog Analyzer

导言&#xff1a; 在当今数字化时代&#xff0c;安全威胁和数据泄露已经成为各个组织和企业面临的严峻挑战。有效的日志管理和监控是确保网络安全的重要一环。本文将介绍EventLog Analyzer&#xff08;事件日志分析器&#xff09;这一强大工具&#xff0c;探索其在日志安全方面…

五、DQL-2.基本查询

一、数据准备 1、删除表employee&#xff1a; drop table employee; 2、创建表emp&#xff1a; 3、添加数据&#xff1a; 4、查看表数据&#xff1a; 【代码】 -- 查询数据--------------------------------------------------------- drop table emp;-- 数据准备-----------…

uni-app image加载错误 404 替换为默认图片

双层v-for 使用item修改 aitem.cat_icon || defaultPic绑定图片src属性为aitem.cat_icon 如果aitem.cat_icon的值为空字符串或undefined&#xff0c;那么默认图片defaultPic被显示出来当图片加载错误时,触发handleImageError方法,将aitem传进去 <!-- 页面--><view …

windows下mysql8定时备份,bat脚本编写,dos免密执行

前提&#xff1a;mysql8已经安装。 编写脚本copy_mysql_data.bat echo off set timestamp%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2% set backupfileD:\ProgramData\MySQL\Backup\backup_%timestamp%.sql set mysqlpathD:\Program Files\MySQL\MyS…