AI智能
改变未来

AspectJ如何通过XML配置文件实现配置切面切点?

AspectJ通过xml文件类来配置切面切点有点类似于传统AOP的配置,但比较简单易懂。

实现方法

1.定义一个通知类
2.在通知类里面定义任意的方法,不像前面注解一样,不需要加任何注解,平淡无奇
3.直接在配置文件种配置通知类的bean,因为已经配置好了aop的xsd文件使用aop命名空间的config进行配置切点切面

还是以用户类做例子,用输出方法代替具体操作

public class User {public void save(){System.out.println(\"save方法\");}public void delete(){System.out.println(\"delete方法\");}}

设置通知类

public class Advisor {public void adviser()    //这里随便定义一个方法都可以,不要加扫描注解{System.out.println(\"用户校验\");}}

xml方式和注解方式最大区别就是这,注解方式为在创造函数的同时给注解,而xml为先声明函数,再在xml文件种配置

在xml文件中先将aop xsd文件配置好,可以看上篇文章

<!--配置目标类--><bean id=\"User\" class=\"com.maoge.demo1.User\"/><!--配置通知类--><bean id=\"Advisor\" class=\"com.maoge.demo1.Advisor\"/><!--开始配置切面--><aop:config><!--先配置切点,可以配置多个切点这里,表达式里用execution来表示范围--><aop:pointcut id=\"Point1\" expression=\"execution(* com.maoge.demo1.User.save(. .))\"/><aop:pointcut id=\"Point2\" expression=\"execution(* com.maoge.demo1.User.delete(. .))\"/><!--配置切面,这里为什么要用Advisor,其实是调用里面的类方法--><aop:aspect ref=\"Advisor\"><!--第一个参数设置是声明类型的通知,因为你在通知类里面方法没有任何声明,在这里声明这是什么类型的通知,第二个就是类里面哪个方法作为通知函数,最后一个就为你刚刚定义的切点--><aop:before method=\"adviser\" pointcut-ref=\"Point1\"></aop:before></aop:aspect></aop:config>

然后在测试类里面测试即可

public class test {@Resource(name = \"User\")private User user;@Testpublic void tt(){user.save();user.delete();}}

得到下面结果

用户校验save方法delete方法

显而易见,在配置文件中前置通知中切点设置的就只有save方法,所以出现上面结果,如果将配置中切面的切点为Point2,则是这种结果

save方法用户校验delete方法
其他类型的通知
  1. 后置通知,自然使用 aop:after-returning标签,当目标函数有returning 值时,在aop中配置
<aop:after-returning method=\"adviser1\" pointcut-ref=\"Point2\" returning=\"after\"/>

这里returning的名称必须和adviser1里面的Object参数名称相同。
adviser1的定义

public void adviser1(Object after){System.out.println(\"校验后\"+ after);}

因为你不知道你的目标方法最后返回的是上面类型的值,可能为int或者String,所以用Object进行了封装。

2.环绕通知,使用aop:around标签

<aop:around method=\"adviser1\" pointcut-ref=\"Point1\" />

还和之前的注解相同,在通知方法里面可以写ProceedingJoinPoint来调用原函数,也可以不调用,这里获得了原函数的主动权。

public Object adviser1(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println(\"校验前\");Object obj=joinPoint.proceed();System.out.println(\"校验后\");return obj;}

调用测试类后结果如下

校验前save方法校验后

可见顺序完全是在环绕通知里面的,那为什么用Object,还是在调用了原函数后,可能人家原函数会return一个值,你要做处理,不能不管吧,然后用Object进行封装,再return出来。

异常通知和最终通知就不详细介绍了,完全和上面一样,就是在配置文件中换个Aop空间的标签即可。
异常通知:aop:after-throwing
最终通知:aop:after

总结

注解方式比较简介方便,你直接在你的通知方法前面直接加上是上面类型的通知,切点的范围即可,就完成了切面的设置。但较多的时候,不容易维护,不好找,而xml配置是将切点和通知集中 在一块了,容易管理,但是稍微比较费事。各有千秋吧。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » AspectJ如何通过XML配置文件实现配置切面切点?