有几天没有学习spring了,今天继续学习尚硅谷spring aop,讲的挺详细的,推荐去看看。

文章目录

  • 一、准备工作
    • 1、导入AspectJ依赖
    • 2、切入点表达式
  • 二 、配置文件实现
    • 1、创建类(作为目标对象),在类里面定义方法
    • 2、编写增强类,在增强类里面定义不同的通知
    • 3、配置注解信息
    • 4、配置通知信息
    • 5、运行结果
    • 6、注意事项

一、准备工作

1、导入AspectJ依赖

  1. 什么是AspectJ:AspectJ是一种用来实现aop操作的一个框架,它并不是Spring里面的,而是一种可以单独实现aop操作的独立的框架。Spring里面一般都是使用这个框架实现aop操作。
  2. 导入AspectJ依赖(maven依赖官网:https://mvnrepository.com)
        <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjtools</artifactId><version>1.9.5</version></dependency><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.0</version></dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>

2、切入点表达式

  1. 什么是切入点表达式:用切入点表达式可以定位想要增强的方法的位置
  2. 具体语法:execution([权限修饰符] [返回类型] [类全路径 ] [ 方法名](参数列表))
  3. 假设我要增强com/example/dao/impl/StuDaoImpl下的select方法,那切入点表达式就是execution(* com.example.dao.impl.StuDaoImpl.select(…)),其中返回类型用表示代表任意的类型都行,public,private等都可以,权限修饰符可以省略不写,参数列表 . .表示任意参数。如果我要增强com/example/dao/impl/StuDaoImpl下面的全部方法,切入点表达式为execution( com.example.dao.impl.StuDaoImpl.(…)),如果要增强com/example/dao/impl包下面的全部类的全部方法,切入点表达式为execution( com.example.dao.impl. * .*(…))

二 、配置文件实现

实现步骤:

1、创建类(作为目标对象),在类里面定义方法

2、编写增强类,在增强类里面定义不同的通知

3、配置注解信息

(1)开启组件扫描
大致配置文件如下,这里和前面设置组件扫描一样,加一个context和aop的命名空间就行。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"></beans>

具体配置方法看下图,复制第一句,将它放到第2,3句的位置,然后前面分别加上 :context和:aop,再把后面bean的位置分别换成context和aop;然后复制第四句,放到第5,6句的位置,分别将5,6句后面的bean换成context 和 aop。

(2)开启组件扫描,注解代理对象和被代理对象
开启组件扫描只需要加入一个context:component-scan标签,这个标签可以将对应类的实例化通过注解方式加入IOC容器,而不用通过xml配置文件。到时候我们直接在IOC容器里面拿出类的实例化就行。base-package属性里面是你实例化类的包路径,我的两个类都在com.example包下。

注解方式如下,通过@Component()注解,详细注解可以看我另一篇博客。

(3)注解代理类
在你的代理类上面加上一个注释@Aspect ,spring就知道你这个类是代理类,就可以执行代理对象里面的方法了。

(4)开启生成对象
通过aop:aspecti-autoproxy标签,就可以通过找到有@Aspect注解的类,然后这个类就是代理类。

4、配置通知信息

一共有5种通知,不同的通知通过不同的注解实现。

  1. 前置通知:@Before(value = "execution(* com.example.dao.impl.StuDaoImpl.select(..))") value里面就是切入点表达式
  2. 后置通知:@After
  3. 异常通知:@AfterThrowing
  4. 环绕通知:@Around
  5. 最终通知: @AfterReturning

5、运行结果

代码:

    @Test
//    测试AspectJ注解方式public void proxyTest002(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-AspectJ.xml");StuDaoImpl stuDao = applicationContext.getBean("stuDao", StuDaoImpl.class);stuDao.select();}
}

6、注意事项

使用AspectJ所代理的类不能实现其它接口,因为aop动态代理一共有两种方法:JDK动态代理和CGLIB动态代理,这里用到的是CGLIB动态代理,它是没有实现接口的,我最开始没有理解这个问题,让被代理的类实现接口,然后一直报错org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'stuDao' is expected to be of type 'com.example.dao.impl.StuDaoImpl' but was actually of type 'com.sun.proxy.$Proxy25'后面把接口实现去掉之后,就可以实现了。
修改之前:

修改之后:

Spring——AOP操作 AspectJ动态代理方式相关推荐

  1. AOP、ASPECT、Spring AOP、JDK动态代理、CGLib动态代理

    AOP.ASPECT.Spring AOP.JDK动态代理.CGLib动态代理 1 AOP介绍 1.1 基本定义 AOP(Aspect Oriented Programming)称为面向切面编程,它是 ...

  2. Spring AOP 概念及动态代理模式

    Spring AOP 概念及动态代理模式 文章目录 Spring AOP 概念及动态代理模式 1 AOP 的概念及相关术语 2 AOP 作用 3 AOP 原理概述 3.1 JDK 动态代理(Proxy ...

  3. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践--AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  4. Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:

    ① JDK动态代理只提供接口的代理,不支持类的代理,要求被代理类实现接口.JDK动态代理的核心是InvocationHandler接口和Proxy类,在获取代理对象时,使用Proxy类来动态创建目标类 ...

  5. 关于Spring AOP,除了动态代理、CGLIB,你还知道什么?

    来源 | 草捏子 责编 | Carol 封图 | CSDN 付费下载于视觉中国 Spring 作为 Java 中最流行的框架,主要归功于其提供的 IOC 和 AOP 功能.本文将讨论 Spring A ...

  6. Spring AOP基础—JDK动态代理

    JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler.其中InvocationHandler动态创建一个符合某一接口的实例,生成目标类 ...

  7. Spring AOP源码分析(四)Spring AOP的JDK动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 本篇文章将会介绍上一个例子中的源码执行情况,从中熟悉整个SpringAOP的一些概念和接口设计. 首先整个SpringAOP的 ...

  8. Spring AOP中的静态代理和动态代理的原理和实践

    对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...

  9. java Spring的AOP理解和动态代理

    Spring的AOP OOP面向对象,允许开发者定义纵向的关系,但并不适用于定义横向的关系,会导致大量代码的重复,而不利于各个模块的重用. AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些 ...

最新文章

  1. PyTorch学习之六个学习率调整策略
  2. python安装库-python 安装库
  3. vtbl 什么时候被改写
  4. “零成本”建设数据中心机房容灾方案
  5. memset 数组初始化
  6. 设计模式的概念和分类
  7. libcareplus多补丁管理
  8. 随想录(常用的c库)
  9. 网络工程师成长日记368-榆林通信大楼项目回忆录
  10. /proc/sys目录下文件的查看方法
  11. 数学建模——主成分分析及spss软件操作
  12. 华数工业机器人教学视频_华数工业机器人教材学习
  13. 3D视觉从入门到精通知识星球
  14. 【问链财经-区块链基础知识系列】 第四十三课 区块链+保险,最全最深入的设计思路就在这儿了!
  15. GeoGebra2笔记:二维或三维画图
  16. c语言程序设计教程内容,(C语言程序设计教程.doc
  17. Google默认壁纸的尺寸要求
  18. 80端口和8080端口的区别是什么?
  19. mysql的zip安装教程
  20. InnoDB与MyISAM的优缺点

热门文章

  1. 用c语言打印空心菱形
  2. 机器人潘森护盾_LOL:他有剑圣的攻速,潘森的眩晕,盲僧的护盾,职业选手却从来不敢用...
  3. 重置root密码(两种方法)
  4. AUTOCAD——超级填充命令2
  5. Redis分布式锁那点事
  6. N皇后问题(分支限界法)
  7. 华为新手机搭载鸿蒙,去美化代表作!华为新手机即将登场,首次搭载鸿蒙!
  8. 富文本编辑器 vue-quill-editor使用(新增,展示,修改,添加附件相关)
  9. 手机号码,身份证号码验证
  10. 台式计算机配置参数,整机配置参数以及性能测试_台式电脑评测-中关村在线