Spring(十二)--Spring AspectJ
程序员文章站
2022-05-11 14:38:50
Spring AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。 AspectJ 是一个面向切面的框架!定义了AOP的语法! Spring 将AspectJ 整合到了自己 ......
spring aspectj
aspectj是一个面向切面的框架,它扩展了java语言。aspectj定义了aop语法,所以它有一个专门的编译器用来生成遵守java字节编码规范的class文件。
aspectj 是一个面向切面的框架!定义了aop的语法!
spring 将aspectj 整合到了自己的框架中!
需要引入两个核心jar
01.aspectj.weaver
02.spring-aspects
(如果你使用的是idea 所需的所有pom节点,在这儿:)
务必掌握的 aspectj 的切入点表达式
execution([访问权限类型] 返回值类型 [完整限定类名]方法名 (参数) [抛出的异常类型])
execution( 返回值类型 方法名(参数))
*:0-n的字符
..:
01.如果是在方法参数中,表示参数可有多个或者可无
02.如果是在包名之后,表示当前包和子包
+:
01.如果定义在类后面,表示当前类以及子类
02.如果定义在接口后面,表示当前接口以及实现类
例子:
1. 使用注解实现
/** * 当前类就是 整个程序中需要的各种系统级业务 * 就是一个切面类 */ @aspect public class myaspectj { @before("execution(* *..userdao.sleep(..))") public void before(){ system.out.println("前置增强........"); } @afterreturning("execution(* *..userdao.sleep(..))") public void afterreturning(){ system.out.println("后置增强........"); } //如果想获取方法的返回值 @afterreturning(value = "execution(* *..userdao.sleep(..))",returning = "result") public void afterreturning(string result){ system.out.println("后置增强........"+result); } /** * 环绕增强可以改变返回值 */ @around("execution(* *..userdao.eat(..))") public object around(proceedingjoinpoint point){ system.out.println("环绕增强进来........"); object result=null; try { result= point.proceed(); //执行目标方法 } catch (throwable throwable) { throwable.printstacktrace(); } system.out.println("环绕增强出去........"); return "orange"; } }
2. 对应的xml文件和测试方法
<!--01.配置目标对象--> <bean id="userdao" class="com.xdf.dao.userdaoimpl"/> <!--02.配置切面--> <bean id="myaspectj" class="com.xdf.annotation.myaspectj"/> <!--03.注册aspectj的自动代理--> <aop:aspectj-autoproxy/> //测试方法 @test public void defaulttest(){ applicationcontext context=new classpathxmlapplicationcontext("spring.xml"); userdao dao= context.getbean("userdao", userdao.class); // system.out.println(dao.eat()); dao.sleep(); }
3. 使用纯切面的方式实现
public class myaspectj { public void before(){ system.out.println("前置增强........"); } public void afterreturning(){ system.out.println("后置增强........"); } /** * 环绕增强可以改变返回值 */ public object around(proceedingjoinpoint point){ system.out.println("环绕增强进来........"); object result=null; try { result= point.proceed(); //执行目标方法 } catch (throwable throwable) { throwable.printstacktrace(); } system.out.println("环绕增强出去........"); return "orange"; } }
4.对应的xml文件和测试方法
<!--01.配置目标对象--> <bean id="userdao" class="com.xdf.dao.userdaoimpl"/> <!--02.配置切面--> <bean id="myaspectj" class="com.xdf.annotation.myaspectj"/> <!--03.注册aspectj需要的切入点--> <aop:config> <!--配置切入点表达式--> <aop:pointcut id="myponit" expression="execution(* *..userdao.sleep(..))"/> <aop:pointcut id="myponit2" expression="execution(* *..userdao.eat(..))"/> <!--配置切面--> <aop:aspect ref="myaspectj"> <aop:before method="before" pointcut-ref="myponit"/> <aop:after-returning method="afterreturning" pointcut-ref="myponit"/> <aop:around method="around" pointcut-ref="myponit2"/> </aop:aspect> </aop:config>
@test public void aspectjtest(){ applicationcontext context=new classpathxmlapplicationcontext("aspectj.xml"); userdao dao= context.getbean("userdao", userdao.class); //system.out.println(dao.eat()); dao.sleep(); }
未完待续!!!
上一篇: 201711671114《Java程序设计》第一周学习总结
下一篇: Tomcat服务器使用(一)
推荐阅读