Spring AOP是什么?
AOP(Aspect-Oriented Programming), 即 面向切面编程
可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。
通俗易懂的来讲就是,将公共部分和核心代码进行分离。
例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。毕竟多个核心功能不存在继承关系,那么日志代码就会大量重复。
而aop 就可以将日志代码 水平的 像个切面一样 分散在各个核心功能中。
AOP中的术语
-
Aspect(切面)
aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑织入到切面所指定的连接点中.
AOP的工作重心在于如何将增强织入目标对象的连接点上, 这里包含两个工作: -
advice(增强)
由 aspect 添加到特定的 join point(即满足 point cut 规则的 join point) 的一段代码.
许多 AOP框架, 包括 Spring AOP, 会将 advice 模拟为一个拦截器(interceptor), 并且在 join point 上维护多个 advice, 进行层层拦截. -
连接点(join point)
程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理.
在 Spring AOP 中, join point 总是方法的执行点, 即只有方法连接点. -
切点(point cut)
匹配 join point 的谓词(a predicate that matches join points).
Advice 是和特定的 point cut 关联的, 并且在 point cut 相匹配的 join point 中执行.
在 Spring 中, 所有的方法都可以认为是 joinpoint, 但是我们并不希望在所有的方法上都添加 Advice, 而 pointcut 的作用就是提供一组规则(使用 AspectJ pointcut expression language 来描述) 来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice. -
目标对象(Target)
织入 advice 的目标对象. 目标对象也被称为 advised object.
因为 Spring AOP 使用运行时代理的方式来实现 aspect, 因此 adviced object 总是一个代理对象(proxied object)
注意, adviced object 指的不是原来的类, 而是织入 advice 后所产生的代理类. -
织入(Weaving)
将 aspect 和其他对象连接起来, 并创建 adviced object 的过程.
根据不同的实现技术, AOP织入有三种方式:-
编译器织入, 这要求有特殊的Java编译器.
-
类装载期织入, 这需要有特殊的类装载器.
-
动态代理织入, 在运行期为目标类添加增强(Advice)生成子类的方式.
Spring 采用动态代理织入, 而AspectJ采用编译器织入和类装载期织入.
-
案例讲解:
方式一:XML配置
提前在pom.xml文件中导入好以下依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
首先在maven项目中的resources资源文件夹下创建spring config 文件
具体配置如下:
测试类调用:
//通过ClassPath路径查找XML配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("xml配置的名字.xml");
//通过getBean方法创建对象
Class<T> getBean(类名.class);
Object getBean("类名");
如图所示:
方式二:注解配置
首先,了解下相关注解:
- @Aspect
切面,配置到切面类上 - @PointCut(“表达式”)
配置切入点,加在方法上 - @Before:
标识一个前置通知方法,相当于BeforeAdvice的功能. - @After:
final通知,不管是抛出异常或者正常退出都会执行. - @AfterReturning:
后置通知,似于AfterReturningAdvice, 方法正常退出时执行. - @AfterThrowing:
异常抛出通知,相当于ThrowsAdvice. - @Around:
环绕通知,相当于MethodInterceptor.
切面类详细配置 如图所示:
调用测试类如图所示:
注意区分的是:
AnnotationConfigApplicationContext 应用在注解配置版
ClassPathXmlApplicationContext 应用在XML配置版
Spring Ioc:参考地址