Spring aop(4)---aspectj

今天讲一下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);

采用切点语言定义切点表达式

  1.  拦截指定包路径中Person类中的void返回类型的空参run方法                                                                                      cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.run()  )");
  2. 拦截指定包路径中Person类中的void返回类型的空参"任意"方法                                                             cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.*()  )");
  3.  拦截指定包路径中Person类中的void返回类型的"仅有一个String类型参数的"任意方法                             cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.*(String)  )");
  4.  拦截指定包路径中Person类中的"String"返回类型的仅有一个String类型参数的任意方法cut.setExpression("execution(String cn.hncu.aop.aspectj.Person.*(String)  )");
  5. 拦截指定包路径中Person类中的"任意返回类型"、"方法名任意"、"仅有一个参数且类型任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*)  )");
  6. 拦截指定包路径中Person类中的任意返回类型、方法名任意、"有且仅有两个参数且类型任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*,*)  )");
  7. 拦截指定包路径中Person类中的任意返回类型、方法名任意、"参数个数与类型均任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(..)  )");
  8. 拦截指定包路径中Person类中的任意返回类型、方法名任意、"第一个参数必须是int型,其它参数的个数与类型任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(int,..)  )");
  9. 拦截指定包路径中Person类中的任意返回类型、方法名任意、"至少有一个参数"的方法                       cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*,..)  )");
  10. 拦截"cn.hncu包中任意深的目录中的类名以son结束的类"中Person类中的任意返回类型、方法名任意、至少一个参数的方法cut.setExpression("execution(* cn.hncu..*son.*(*,..)  )");

下面是XML配置使用Spring aop的步骤:

一、导包4+2

二、准备目标对象

三、准备通知

四、配置进行织入,将通知织入

猜你喜欢

转载自blog.csdn.net/lx678111/article/details/83281059