今天讲一下Spring aop中的AspectJ:
一、AspectJ简介
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器
用来生成遵守Java字节编码规范的Class文件。
二、优势:
aspectj技术主要是改进之前定位切点时不够精确的问题,如aspectj可以使用切点语言定义切点更具体的特征如方法的返回类型、
方法的形参等
三、使用
aspectj定义切点时采用的是切点语言,助理解:
△设置切点: cut.setExpression("execution( 用切点语言写的切点表达式 )");
△用切点语言写的切点表达式---相关知识点如下:
1) 切点表达式格式: 返回类型 包名.[子包名.]类名.方法名(参数类型列表)
2) "."是包名之间 或 包名与类名 或 类名与方法名 之间的
间隔符
3) ".."在包路径位置代表任意深的目录,在参数类型列表位置代表任意个数与类型的参数
4) "*"是操作系统中的通匹符
关键代码段:
//※※※※※※和之前的第一种切点技术相比有变化的就是这一点(使用购买来的aspectj)
//声明AspectJ的切点
AspectJExpressionPointcut cut = new AspectJExpressionPointcut();
//采用切点语言的表达式---指定切点
cut.setExpression("execution( * cn.hncu..*son.*(..) )"); //
//通知
Advice advice = new MethodInterceptor() {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("前面拦拦....");
Object reutnValue = invocation.proceed();//放行
System.out.println("后面拦拦....");
return reutnValue;
}
};
//切面=切点+通知
Advisor advisor = new DefaultPointcutAdvisor(cut, advice);
//代理工厂
ProxyFactoryBean factory = new ProxyFactoryBean();
factory.setTarget(p);
factory.addAdvisor(advisor);
采用切点语言定义切点表达式
- 拦截指定包路径中Person类中的void返回类型的空参run方法 cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.run() )");
- 拦截指定包路径中Person类中的void返回类型的空参"任意"方法 cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.*() )");
- 拦截指定包路径中Person类中的void返回类型的"仅有一个String类型参数的"任意方法 cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.*(String) )");
- 拦截指定包路径中Person类中的"String"返回类型的仅有一个String类型参数的任意方法cut.setExpression("execution(String cn.hncu.aop.aspectj.Person.*(String) )");
- 拦截指定包路径中Person类中的"任意返回类型"、"方法名任意"、"仅有一个参数且类型任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*) )");
- 拦截指定包路径中Person类中的任意返回类型、方法名任意、"有且仅有两个参数且类型任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*,*) )");
- 拦截指定包路径中Person类中的任意返回类型、方法名任意、"参数个数与类型均任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(..) )");
- 拦截指定包路径中Person类中的任意返回类型、方法名任意、"第一个参数必须是int型,其它参数的个数与类型任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(int,..) )");
- 拦截指定包路径中Person类中的任意返回类型、方法名任意、"至少有一个参数"的方法 cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*,..) )");
- 拦截"cn.hncu包中任意深的目录中的类名以son结束的类"中Person类中的任意返回类型、方法名任意、至少一个参数的方法cut.setExpression("execution(* cn.hncu..*son.*(*,..) )");