spring 中 AOP 功能
1 PointCut 由 ClassFilter 和 MethodMatcher 构成,通过 ClassFilter 定位到类上,通过 MethodMatcher 定位到方法。
2 Spring 支持两种方法匹配器:静态方法匹配器和动态方法匹配器。
静态方法匹配器仅对方法名签名进行匹配;动态方法匹配器会在运行期检查方法入参的值。
静态匹配仅会匹配一次;动态匹配因为每次调用方法的入参可能不一样,所以每次调用都需要判断。因此动态匹配对性能影响比较大。
3 Advisor 既包含切点代码又包含连接点信息(方法前、方法后)。切面可以分为三类:一般切面、切点切面和引介切面
- Advisor:代表一般切面,仅包含一个 Advice ,因为 Advice 包含了横切代码和连接点信息。他代表的连接点是所有目标类的所有方法,因为该横切面太宽泛,所以一般不用。
- PointcutAdvisor:代表具有切点的切面,包含 Advice 和 Pointcut 两类。
- IntroductionAdvisor:引介切面,它应用于类层面上,所以使用 ClassFilter 定义
4 基于配置使用@AspectJ 切面
在配置文件中使用
<aop:aspectj-autoproxy />
自动为 Spring 容器中那些匹配 @AspectJ 切面的 Bean 创建代理,完成切面织入。在 Spring 内部使用 AnnotationAwareAspectJAutoProxyCreator 进行自动代理的创建。
它有一个属性 proxy-target-class,默认是 false,表示使用jdk 动态代理。当设置为 true 时,表示使用 CGLib 动态代理技术。不过即使设置为 false,如果目标类中没有接口,Spring 自动使用
CGLib 动态代理。
<aop:aspectj-autoproxy proxy-target-class="true" />
5 Spring 支持9个 @AspectJ 切点表达式函数,根据描述对象的不同,可以分为 4 种类型
在多个表达式之间使用 || , or 表示 或 ,使用 && , and 表示 与 , ! 表示 非
例如:
@Pointcut("execution(* com.huitong.controller..*.* (..)) " +
"&& @annotation(org.springframework.web.bind.annotation.RequestMapping)")
public void controllerPoint() {
}
6 切点函数入参使用通配符, @AspectJ 支持3种通配符。
- “*”,匹配任意字符,但它只能匹配上下文中一个元素。
- “..”,匹配任意字符,可以匹配多个元素;但在表示类时,必须和 * 联合使用。
- “+”,按类型匹配指定类的所有类,必须跟在类名后面,如 com.smart.Car+。继承或扩展指定类的所有类,同时还包括指定类的本身。
支持所有通配符:execution(),within()
仅支持“+”通配符:args(),this(),target()
不支持通配符:@args(),@within(),@target()
7 @AspectJ 提供的增强类型
- @Before ,该注解拥有两个成员,1)value用于定义切点 2)argNames,注解所标注增强方法的参数名
- @AfterReturning 后置增强,有4个成员。1)value 用于定义切点 2)pointcut 表示切点信息。如果显示指定 pointcut 值,那么他将覆盖 value 的设置值。可将 pointcut 看做 value 同义词 3)returning 将目标对象方法的返回值绑定给增强的方法 4)argNames:如前所述
- @Around,环绕增强,两个成员 1)value 用于定义切点 2)argNames:如前所述
- @AfterThrowing,抛出增强,1)value 用于定义切点 2)pointcut 表示切点信息,如果显示指定 pointcut 值,那么他将覆盖 value 的设置值。 3)throwing 将抛出的异常绑定到增强方法中 4)argNames:如前所述
- @After:不管是抛出异常还是正常退出,该增强都会得到执行。有两个成员,1)value 用于定位切点 2)argNames:如前所述
8 execution()切点函数,需要定位到方法
“.*”:表示包下所有类,“..*”:表示包、子孙包下的所有类。
within(),类匹配模式串,只能定位到类,且不是接口。
9 命名切点:使用 @Pointcut 注解及切面类方法对切点进行命名。
如果在增强类型里面直接定义切点,这种称为匿名切点。
例子如下:
命名切点是用类方法作为切点名称,方法的访问修饰符控制了切点的可引用性。
10 定义好切点后就可以在切面中通过名称引用切点。例子如下
11 访问连接点信息 AspectJ 使用 JoinPoint 接口表示目标类连接点对象。如果是环绕增强,则使用 ProceedingJoinPoint 表示连接点对象,该类是
JoinPoint 子接口。任何增强方法都可以通过第一个参数声明为 JoinPoint 访问连接上下文信息。
11.2 ProceedingJoinPoint 继承于 JoinPoint 接口,它新增两个用于执行连接点的方法。
例子如下:
spring 中 AOP 功能的更多相关文章
- Spring中AOP原理,源码学习笔记
一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...
- Spring中AOP简介与切面编程的使用
Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...
- 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)
一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...
- Spring 中aop切面注解实现
spring中aop的注解实现方式简单实例 上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们 ...
- Spring中AOP相关源码解析
前言 在Spring中AOP是我们使用的非常频繁的一个特性.通过AOP我们可以补足一些面向对象编程中不足或难以实现的部分. AOP 前置理论 首先在学习源码之前我们需要了解关于AOP的相关概念如切点切 ...
- AOP 与 Spring中AOP使用(上)
AOP简介 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续 ...
- JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解
在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...
- Spring中AOP相关的API及源码解析
Spring中AOP相关的API及源码解析 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring ...
- 浅析Spring中AOP的实现原理——动态代理
一.前言 最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...
随机推荐
- 敏捷开发方法XP的12个最佳实践
极限编程(eXtreme Programming,简称XP)是一种轻量级.高效.低风险.柔性.可预测的.科学的软件开发方法,其特性包含在12个最佳实践中. 1. 计划游戏 ( Planning Ga ...
- 为什么空格拷贝到linux 会变成两个
为什么空格拷贝到linux 会变成两个 学习了:https://zhidao.baidu.com/question/266438357.html 在vi界面内输入:set paste 然后进行拷贝: ...
- (转)Unity3D新手引导开发手记
转自:http://www.cnblogs.com/ybgame/p/3844315.html 最近开始接手新手引导的开发,记录下这块相关的心得 首先客户端是Unity,在接手前,前面的同学已经初步完 ...
- java list按照元素对象的指定多个字段属性进行排序
ListUtils.java---功能类 package com.enable.common.utils; import java.lang.reflect.Field;import java.tex ...
- (数据挖掘-入门-3)基于用户的协同过滤之k近邻
主要内容: 1.k近邻 2.python实现 1.什么是k近邻(KNN) 在入门-1中,简单地实现了基于用户协同过滤的最近邻算法,所谓最近邻,就是找到距离最近或最相似的用户,将他的物品推荐出来. 而这 ...
- C#.NET常见问题(FAQ)-Visual Studio VS如何显示行号
工具-选项,然后勾选"显示所有设置",然后在文本编辑器下面找到所有语言,勾选"行号"即可. 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: ...
- ListView实现数据列表显示
要将数据库中的数据列表显示在屏幕上,我们要使用ListView这个控件,当用户从数据库中取出数据时,要将数据绑定到显示控件上,如何绑定呢,我们需要创建适配器进行绑定,创建适配器有两种方式: 第一种是用 ...
- iOS new 和 alloc的区别
一般如果只是 alloc init 那么 用new 是一样的 SomeObject*myObject =[[SomeObject alloc] init]; SomeObject*myObject = ...
- 移动端兼容 - faskclick.js
fasckclick为解决移动端300ms延迟而生 github地址为:https://github.com/ftlabs/fastclick 使用方法: 1. 原生使用(window.onload或 ...
- Eclipse 中选中一个单词 ,其他相同的单词颜色就会变化
"Window"-"preferences"-"Java"-"Editor"-"Mark Occurrence ...