十九、SpringAOP切面的单例与多例

2023-11-09

在这里插入图片描述

@Repository
@Scope("prototype")
public class UserDao implements IUserDao {

    public void save(){
        System.out.println("保存成功,无返回值");
    }
}
@Configuration
@ComponentScan("com.liaoxiang")
//默认使用的JDK动态代理
@EnableAspectJAutoProxy()
public class AppConfig {

}
@Component
@Aspect
//@Scope("prototype")
public class Advice {
    /**
     * execution
     * dao包下的所有方法都增强
     */
    @Pointcut("execution(* com.liaoxiang.dao.impl.*.*(..))")
    public void pointCutExecution1 (){}

    /**
     * 增强方法
     */
    @Before("pointCutExecution1()")
    public void before(){
        System.out.println("增强方法执行,当前切面:"+this.hashCode());
    }
}
public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        IUserDao dao1 = (IUserDao)ac.getBean("userDao");
        IUserDao dao2 = (IUserDao)ac.getBean("userDao");
        System.out.println("dao1: "+dao1.hashCode());
        System.out.println("dao2: "+dao2.hashCode());
        dao1.save();
        dao2.save();
    }
}
执行结果:
dao1: 1279584786
dao2: -1597778003
增强方法执行,当前切面:1620890840
保存成功,无返回值
增强方法执行,当前切面:1620890840
保存成功,无返回值

当我们想要对某个类的某些方法进行增强的时候,而这类如果是多例的,上面的配置使用的切面却是单例的,如果要使切面也是多例的,则在使用JDK动态代理的情况下,需要作如下的配置

@Component
@Aspect("perthis(target(com.liaoxiang.dao.impl.UserDao))")
public class Advice {
    /**
     * execution
     * dao包下的所有方法都增强
     */
    @Pointcut("execution(* com.liaoxiang.dao.impl.*.*(..))")
    public void pointCutExecution1 (){}

    /**
     * 增强方法
     */
    @Before("pointCutExecution1()")
    public void before(){
        System.out.println("增强方法执行,当前切面:"+this.hashCode());
    }
}

再次执行测试方法

dao1: -1527878935
dao2: -827515386
增强方法执行,当前切面:1648001170
保存成功,无返回值
增强方法执行,当前切面:169663597
保存成功,无返回值

注意:在使用默认JDK动态代理的时候,配置切面的时候不能使用this

@Aspect("perthis(this(com.liaoxiang.dao.impl.UserDao))")

如果使用的是CGLIB动态代理,@EnableAspectJAutoProxy(proxyTargetClass = true),则二者皆可。







本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

十九、SpringAOP切面的单例与多例 的相关文章

随机推荐

  • H5 PCM转WAV实时音频直播代码实现细节

    一 前端实现 H5数据采集 web audio的概念和使用详见 接口文档 采集音频数据 var context new AudioContext var audioInput context createMediaStreamSource
  • mysql 强制使用索引和强制不使用索引

    前一段面试时问过这个问题 当时不太懂 今天刚好看到这一块的内容就梳理下 首先说个概念 SQL提示 就是在sql中加入我自己的提示来达到我想要的效果 关于索引有三种sql提示 use index index name 希望mysql参考的索引
  • 手把手教你SQLite在Windows/VS下的安装配置及使用(超详细,不会你怪我)

    目录 一 系统环境 二 下载 三 配置系统环境 四 使用命令win r 输入cmd命令 一 系统环境 我这里用的是 Win10 64Bit VS2015 不同版本相差不大 其版本也可以参考这个安装教程 二 下载 SQLite的官网下载地址
  • 【Ubuntu】格式化U盘

    要格式化 U 盘 你可以使用以下命令来执行 请注意 执行此命令将删除 U 盘上的所有数据 请确保在执行命令之前备份重要文件 在 Linux 上 使用 mkfs 命令格式化 U 盘的步骤如下 打开终端应用程序 确定 U 盘的设备名称 运行以下
  • keyshot分辨率多少合适_keyshot电脑配置浅谈

    以下说明均以官方keyshot7 3 4以上版本为例 我们先看一下keyshot官方给出的安装所需的基本电脑配置需求 官方注释 KeyShot将利用所有可用的CPU内核 因此 更多的CPU核心 线程将产生更快的渲染时间 虽然KeyShot不
  • RabbitMQ初级教程,基础知识

    RabbitMQ学习笔记 RabbitMQ 1 初识MQ 1 1 同步和异步通讯 1 1 1 同步通讯 1 1 2 异步通讯 1 2 技术对比 2 快速入门 2 1 安装RabbitMQ 2 2 RabbitMQ消息模型 2 3 导入Dem
  • linux系统小白入门基础(含常用基本命令)

    Linux概述 简要介绍 Linux内核最初只是由芬兰人李纳斯 托瓦兹 Linus Torvalds 在赫尔辛基大学上学时出于个人爱好而编写的 Linux是一套免费使用和自由传播的类Unix操作系统 是一个基于POSIX和UNIX的多用户
  • 上例中便是调用GetSystemMenu函数的

    有如下问题请教各位 1 为什么程序在调用window api或者dll中的输出函数时用的形式是 00401375 FF1514324000 Call dword ptr 004
  • 制作esp32-cam拍照上传,微信小程序照片显示的监控小车

    前期配件准备 ESP32 CAM开发环境配置 程序下载 连接小车 控制台查看图片 微信小程序的开发 1 前期配件准备 小车套件 网上购买即可 较为方便的选择 ESP32 CAM 推荐安信可 外加TTL下载器 方便烧录程序 L298N马达驱动
  • User-agent

    1 手机User Agent 更多关于手机User Agent请 点击 UPPOOL Mozilla 5 0 Linux U Android 8 1 0 zh cn BLA AL00 Build HUAWEIBLA AL00 AppleWe
  • 盘点

    选自Github 机器之心编译 hunkim 盘点了 Github 上 18 个深度学习项目 根据收藏数自动排名 最新的一次 update 在几小时前完成 项目地址 https github com hunkim DeepLearningS
  • sh: 1: pause: not found

    linux下运行c 程序时 希望控制台不会输出后马上消失 在windows系统下 用如下语句 include
  • redis-benchmark 基准测试

    redis benchmark 基准测试 大家好 我是爱吃鱼的程序员 一个渴望在互联网行业做到C位的程序员 可柔可刚 点赞则柔 白嫖则刚 看完记得给我来个三连哦 欢迎私信 1 概述 当我们希望提高性能的使用 往往想到的是异步 缓存这个两种手
  • nginx部署的时候出现403错误

    nginx部署的时候出现403错误 原因 启动用户和nginx工作用户不一致所致 解决方法 1 先查看当前的启动用户 命令 ps aux grep nginx worker process awk print 1 这样就是启动用户和工作用户
  • Linux下多线程调试的一些方法

    一直觉得Linux下的多线程调试是很麻烦的 因为一般大一点的程序线程会很多 通过gdb的info thread命令看全都是系统调用 看不到详细的方法 至少我看到是这样的 如果用thread id跟进每个thread去bt 是件相当痛苦的事情
  • 关于spring-boot中的@SpringBootApplication中的@ComponentScan的basePackages的路劲的设置。...

    最近在看spring boot的东西 然后搭建了spring boot的简单项目 但是在spring的入口处加载的时候一直加载不到 最后看了 SpringBootApplication的源码才知道 ComponentScan 如果不设置ba
  • ChatGPT教程:如何优化我们编写的Python代码?

    背景介绍 作为一名程序员 我们经常需要编写Python代码 然而 代码质量的好坏直接关系到程序的可读性 可维护性和可扩展性 因此 我们需要使用一些工具来帮助我们提高代码质量 ChatGPT是一种强大的自然语言处理模型 可以帮助我们完成这项任
  • 全面接入:ChatGPT杀进15个商业应用,让AI替你打工

    智东西 智能产业新媒体 智东西专注报道人工智能主导的前沿技术发展 和技术应用带来的千行百业产业升级 聚焦智能变革 服务产业升级 ChatGPT狂飙160天 世界已经不是两个月前的样子 文 李水青 编辑 心缘 来源 智东西 ID zhidxc
  • findbug类型

    Summary Description Category BC Equals method should not assume anything about the type of its argument Bad practice BIT
  • 十九、SpringAOP切面的单例与多例

    Repository Scope prototype public class UserDao implements IUserDao public void save System out println 保存成功 无返回值 Config