Spring学习笔记
AOP详解与实战
aop相关概念:
- 连接点(Join point)
连接点是在应用执行过程中能够插入切面的一个点。 - 切点(Pointcut)
一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”。因此,切点其实就是定义了需要执行在哪些连接点上执行通知。 - 切面(Aspect)
切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和在何处完成其功能。 - 织入(Weaving)
织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。
AspectJ的aop写法
通配符的使用:
- *:匹配所有字符
- …:一般用于匹配多个包,多个参数
- +:表示类及其子类
- 运算符有:&&,||,! AspectJ使用 且(&&)、或(||)、非(!)来组合切入点表达式。
-
execution( * com.example.aop..(…))
execution:就是表达式的主体。 第一个*:返回类型,可以用代表所有类型 com.example.aop:表示需要拦截的路径包名 第二个*:类名,可以用代表所有类 第三个*:方法名,可以用*表示所有方法 (..):..表示任意参数
-
@Around(“within(类型表达式)”)
within(cn.javass..*) cn.javass包及子包下的任何方法执行 within(cn.javass..IPointcutService+) cn.javass包或所有子包下IPointcutService类型及子类型的任何方法 within(@cn.javass..Secure *) 持有cn.javass..Secure注解的任何类型的任何方法,必须是在目标对象上声明这个注解,在接口上声明的对它不起作用
-
@Around("@within(注解类型))
@within cn.javass.spring.chapter6.Secure) 任何目标对象对应的类型持有Secure注解的类方法;必须是在目标对象上声明这个注解,在接口上声明的对它不起作用
-
@Around(“target(类型全限定名)”)
target(cn.javass.spring.chapter6.service.IPointcutService) 当前目标对象(非AOP对象)实现了 IPointcutService接口的任何方法 target(cn.javass.spring.chapter6.service.IIntroductionService) 当前目标对象(非AOP对象) 实现了IIntroductionService 接口的任何方法不能是引入接口
-
@Around(“@target(注解类型)”)
@target (cn.javass.spring.chapter6.Secure) 任何目标对象持有Secure注解的类方法;必须是在目标对象上声明这个注解,在接口上声明的对它不起作用
-
@Around(“args(参数类型列表)”)
args (java.io.Serializable,..) 任何一个以接受“传入参数类型为 java.io.Serializable” 开头,且其后可跟任意个任意类型的参数的方法执行,args指定的参数类型是在运行时动态匹配的
-
@Around(“@args(注解列表)”)
@args (cn.javass.spring.chapter6.Secure) 任何一个只接受一个参数的方法,且方法运行时传入的参数持有注解 cn.javass.spring.chapter6.Secure;动态切入点,类似于arg指示符;
-
@Around(“@annotation(注解类型)”)
@annotation(cn.javass.spring.chapter6.Secure ) 当前执行方法上持有注解 cn.javass.spring.chapter6.Secure将被匹配
-
@Around(“this(类型全限定名)”)
this(cn.javass.spring.chapter6.service.IPointcutService) 当前AOP对象实现了 IPointcutService接口的任何方法 this(cn.javass.spring.chapter6.service.IIntroductionService) 当前AOP对象实现了 IIntroductionService接口的任何方法也可能是引入接口
JoinPoint对象
public interface JoinPoint {
String toString(); //连接点所在位置的相关信息
String toShortString(); //连接点所在位置的简短相关信息
String toLongString(); //连接点所在位置的全部相关信息
Object getThis(); //返回AOP代理对象
Object getTarget(); //返回目标对象
Object[] getArgs(); //返回被通知方法参数列表
Signature getSignature(); //返回当前连接点签名
SourceLocation getSourceLocation();//返回连接点方法所在类文件中的位置
String getKind(); //连接点类型
StaticPart getStaticPart(); //返回连接点静态部分
}
ProceedingJoinPoint对象介绍:
ProceedingJoinPoint对象是JoinPoint的子接口。
主要多了如下两个方法:
Object proceed() throws Throwable //执行目标方法
Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法
关于Signature对象介绍:
Signature对象:是一个接口。用于获取或记录有关连接点的反射信息。他的子接口还提供了很多额外的实用方法。
常用子接口如下:
UnlockSignature 实现类 UnlockSignatureImpl
LockSignature 实现类 LockSignatureImpl
CatchClauseSignature 实现类 CatchClauseSignatureImpl
MemberSignature
子接口 FieldSignature 实现类 FieldSignatureImpl
子接口 CodeSignature[它还有很多子接口] 实现类 CodeSignatureImpl
常用方法如下:
String toString();
String toShortString(); //返回此签名的字符串缩写形式
String toLongString(); //返回此签名的字符串扩展形式
String getName(); //返回此签名的方法【即返回方法名】
int getModifiers(); //以整数形式返回此签名方法的修饰符。
Class getDeclaringType(); //返回一个java.lang.Class对象,该对象表示声明此成员的类或接口。
String getDeclaringTypeName(); //返回声明类型的全限定名称