# spring中基于xml的AOP配置步骤
####最近学习了spring中的aop配置,就写一篇关于基于xml的aop配置的文章。
这个文章都是xml文件当中的配置代码讲解
基于spring的ioc,要先把业务层的Service对象配置进来
<bean id="唯一标识符,可以自己定" class="填写服务类的具体实现类"></bean>
1.把通知bean交给spring来管理。
<bean id="唯一标识符,自己定" class="你要配置的通知所在的类"></bean>
2.使用aop:config标签来表明开始aop的配置
<aop:config> 里面写步骤2以后的配置 </aop:config>
3.使用aop:aspect 标签来表明配置切面,注意这个配置内容在步骤2中的aop:config标签内
属性包含 : id:唯一表示符,自己定
ref:是给指定的通知类bean的id,也就是你想要配置的通知类,也就是步骤1当中你自己定的id,相当于应用。
<aop:aspect id="唯一标识符,内容自己定" ref="步骤1中的配置id">
4.在aop:aspect标签内配置通知的类型
提到这里我们必须要知道,通知的类型包含了前置通知,后置通知,异常通知,最终通知,以及环绕通知。
这里我们所讲到的基于xml文件来配置通知,所以我们只讲除开环绕通知的其他四种通知。因为我学习到的内容,环绕通知是在通知类当中通过proceed方法来提供我们进入环绕通知的接口。这是spring提供给我们手动控制代码增强的方法。
好的现在言归正传,继续回到四种通知的具体标签。
前置通知
<aop:before method="prePrintlog" pointcut=""></aop:before>-->
后置通知
<aop:after method="finalPrintlog" pointcut=""></aop:after>-->
异常通知
<aop:after-throwing method="excePrintlog" pointcut=""></aop:after-throwing>
最终通知
<aop:after-returning method="afterPrintlog" pointcut=""></aop:after-returning>
上面这四个通知中,后置通知和异常通知是不能同时出现的,因为只有在正常运行后才会运行后置通知,故异常通知将不会执行,而当异常出现时,则会执行异常通知,不会执行后置通知。
这里的四个标签的属性都是相类似,所以下面统一说明。
method:这里写明在通知类当中的方法名
pointcut:用于指定切点表达式,该表达式的意义在于对业务层的哪些方法进行具体的增强。就是在一开始我们所提到的服务层实现类的具体方法。
接下来我说一下具体的切点表达的写法。
关键字:excution(表达式)
表达式:访问修饰符,返回值类型,包名.包名.类名.类名.方法名(参数列表)这里的包名和类名的具体就是你的业务层实现类相对于这个项目文件的相对路径。
标准的表达式:public void Test.Service.printlog(i)
这里我们也可以使用通配符来简写表达式。
访问修饰符:这里的访问修饰符是可以省掉的。
返回数据类型:返回数据类型可以是用一个星号*来适配所有的返回类型,注意这里的后面必须有空格
包名类名:当然如果你这里的包名和类名中如果太多了,也可以使用通配符去适配那个包或类,一个星号*表示在上一层中的所有子内容都可适配。有几级包就要写几个星号* ,也可以使用..来表示当前包及其所有子包和类。方法名也可以是用星号*来适配,表示所有当前类中的方法
参数列表:可以使用一个星号表示所有的参数类型,这里要注意的是填写了星号*适配的是带参数的方法,并不能适配不含参数的方法,如果要适配带参数和不带参数的所有指定方法可以写..
全通配写法:也就是让这个类中的所有方法都得到加强
* *..*.*(..)
但是要注意使用通配符有必须要在maven里添加依赖,如果没有添加这个依赖或者没有aspectj这jar包,将不能识别通配符中的*和.
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
上面提到的环绕通知需要在通知类中写,给出一个我学习课程当中的实列
public Object aroundPrintf(ProceedingJoinPoint pjp){
Object reValue;
try {
Object[] args = pjp.getArgs(); /* 得到方法的参数*/
System.out.println("前置通知执行了");
reValue = pjp.proceed(args); //这一行就是通知入口的接口。
System.out.println("后置通知执行了");
return reValue;
}catch(Throwable t){
System.out.println("异常通知执行了");
throw new RuntimeException(t);
}finally {
System.out.println("最终通知执行了");
}
}