Spring使用AspectJ实现AOP前置通知

       其实AOP_AspectJ的编程与传统的AOP的编程的最大的区别就是写一个Aspect 支持多个Advice和多个PointCut 。而且我们写AOP_Aspctj不需要继承任何的接口,不像传统的AOP还要继承接口。

1、前置通知是在运行我们被代理的方法之前先执行的。

2、前置通知具有如下的特点:

1)在目标方法执行前 进行增强代码。

2)AspectJ 提供Advice无需实现任何借口, 可以将很多通知代码 写入一个类 (切面类)

3)前置通知定义方法: 无返回值,可以传入参数 JoinPoint 连接点

Spring框架教程【IDEA版】-Spring框架从入门到精通

简介:

本套Java视频教程主要讲解了Spring4在SSM框架中的使用及运用方式。本套Java视频教程内容涵盖了实际工作中可能用到的几乎所有知识点。为以后的学习打下坚实的基础。


什么是AOP?

AOP面向切面编程,是基于动态代理的。AOP就是动态代理的规范化,把动态代理的实习按步骤和方式都定义好了,让开发人员用一种统一的方式使用动态代理。

Aspect Orient Programming:面向切面编程

Aspect:切面。给目标类增加的功能就是切面。添加的日志信息和事务都是切面。

切面的最大特点就是:非业务方法,和我们的业务功能没有关系,可以独立使用的。

怎么理解面向切面编程:

1、需要在分析项目时,找出切面。

2、合理的安排切面的执行时间(是在目标方法前执行,还是在目标方法后执行)。

3、合理的安排切面执行的位置(在哪个类,哪个方法增加增强功能)。

术语:

1、Aspect:切面,表示要给业务方法增强的功能,就是一堆代码,这堆代码完成某一个功能。切面是非业务功能(日志,事务,统计信息,参数检查,权限验证)

2、JoinPoint:连接点,连接业务方法和切面的位置,就是某个类中的业务方法。

3、PointCut:切入点,指多个连接点方法的结合。是多个方法,这些方法都要加入切面的功能。

4、目标对象:要给哪个类增加方法

5、Advice:通知,表示切面功能的执行时间(切面在什么时候执行,是在方法之前还是在方法之后)

一个切面有3个关键的要素:

1、切面的功能代码:切面要干什么

2、切面的执行位置,使用pointcut表示

3、切面的执行时间:在目标方法之前还是在目标方法之后,用advice表示

AOP的实现:是一个规范,是对动态代理的一个规范化。

AOP的技术实现框架:

1.Spring:Spring实现了AOP规范,主要在事务处理时使用了AOP。项目开发中很少使用Spring的AOP实现。

2.aspectJ:一个开源的专门做AOP的框架。Spring框架中集成了aspectJ框架,通过Spring就能使用aspectJ框架的功能了。aspectJ框架实现AOP有两种方式:

1)使用xml配置文件

2)使用注解(我们在项目中要做AOP功能,一般都使用注解),aspectJ有5个注解。

学习aspectJ框架的使用:

1、切面的执行时间,也就是advice通知。在aspectJ框架中是使用注解来表示的。

@Before:

@AfterReturning

@Around

@AfterThrowing

@After

2、表示切面执行的位置,使用的是切入点表达式。

execution (访问权限 方法返回值 方法声明(参数)异常类型)

其中,访问权限和异常类型这两个可以省略。

切入点表达式要匹配的对象就是目标方法的方法名字。

举例:

execution(public **(..)):指定切入点为任意公共方法

execution(*set*(..)):指定切入点为任何一个以set开始的方法

execution(*com.xyz.service.*.*(..)):指定切入点为com.xyz.service 包中的任意类中的任意方法

使用aspectJ框架实现aop

使用aop的目的是给已经存在的类和方法在不改变原来的代码的情况下增加额外的功能。

使用aspectJ实现AOP的基本步骤:

1、新建maven项目

2、加入依赖:Spring依赖、aspectJ依赖、Junit 单元测试

3、创建目标类:这个类有接口和接口的实现类。我们想要给这个类中的方法增加功能。

4、创建切面类(增加功能的代码写在切面类里面):普通类

      1)在类的上面加入@Aspect注解

       2)在类中定义切面方法,方法就是切面要执行的功能代码。在方法上面加入aspectJ中的通知注解,例如@Before,还需要指定切入点表达式。

5、要把对象交给容器去创建,由容器Spring管理这些对象。

    创建Spring的配置文件,在配置文件中声明对象,把对象交给容器统一管理。声明对象可以使用注解或者xml的<bean>标签。

     1)声明目标对象

     2)声明切面类对象

     3)声明aspectJ框架中的自动代理生成器标签。

    自动代理生成器:用来完成代理对象的自动创建功能的。

6、创建测试类,从Spring容器中获取目标对象(这个对象实际就是代理对象)。通过代理执行方法,实现AOP的功能增强。

完整代码:

IDEA-Maven-模板选择quickstart-pom.xml添加相关依赖:(1)Spring依赖(2)aspectJ依赖(3)Junit 单元测试

Maven查看添加的依赖:

Com.hik包下面的类和接口:

SomeService接口

SomeService接口的实现类SomeServiceImpl

MyAspect类

main目录下的resource中设置配置文件:applicationcontext.xml

测试类

执行结果:

前置通知,切面功能:在目标方法之前输出执行时间:Thu Jan 13 16:30:16 CST 2022

目标方法doSome()执行

Process finished with exit code 0

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容