上一篇我们介绍Spring AOP的注解的配置,也叫做Java Config。今天我们看看比较传统的xml的方式如何配置AOP。整体的场景我们还是用原来的,“我穿上跑鞋”,“我要去跑步”。Service层的代码我们不变,还是用原来的,如下:

@Service
public class MyService {
public void gotorun() {
System.out.println("我要去跑步!");
}
}

再看看上一篇中的MyAspect代码,里边都是使用注解配置的,我们AOP相关的配置全部删除掉,只留下“我床上跑鞋“这样一个方法,如下:

public class MyAspect {
public void putonshoes() {
System.out.println("我穿上跑步鞋。");
}
}

类中没有任何的注解,我们将全部通过xml的方式配置AOP。首先,我们要在xml中引入aop的schema,如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd"> </beans>

有了aop的schema,我们就可以使用Spring的aop的标签了,我们先将MyAspect实例化,因为我们的通知方法”我穿上跑鞋“在这个类中,如下:

<bean id="myAspect" class="com.example.springaopdemo.aspect.MyAspect" />

其中,id我们配置为myAspect。然后,我们就要配置<aop:config>了,这个标签说明这是一段aop配置,具体的aop内容都在这个标签内,如下:

<aop:config proxy-target-class="true">
……
</aop:config>

其中,我们还可以配置proxy-target-class这个属性,还记得这个属性是什么意思吗?对了,它代表着是否使用CGLIB代理,由于我们项目引入的依赖是spring-boot-starter-aop,默认是使用CGLIB的,所以这里配置不配置都可以。

然后在里边我们配置切面<aop:aspect>,它标识着这是一个切面配置,在标签里还要指定我们的切面的bean,也就是myAspect,如下:

<aop:aspect id="aopAspect" ref="myAspect">
……
</aop:aspect>

切面的id叫做aopAspect,ref指定我们切面的bean,就是前面实例化的myAspect。好了,切面就配置好了,然后就是切点和通知。切点和通知的配置一定要在<aop:aspect>内,说明这个切点和通知属于当前这个切面的。

先来看看切点<aop:pointcut>的配置吧,如下:

<aop:pointcut id="pointcut"
expression="execution(* com.example.springaopdemo.service.*.*(..))">
</aop:pointcut>

是不是很熟悉,我们看到了匹配方法的表达式。同样,我们要给切点定义一个id叫做pointcut,然后expression就是匹配的表达式,这个和上一篇是一样的,没有区别。在这里,我们还是匹配service包下的所有类的所有方法。好了,到这里切点就配置完成了。

最后,再来看看通知,通知是和<aop:pointcut>并列的,都在<aop:aspect>内,具体如下:

<aop:before method="putonshoes" pointcut-ref="pointcut"></aop:before>

通知的5种类型,分别对应着5个不同的标签,在这里我们还是使用前置通知<aop:before>,在标签的内部,要指定它对应的切点,pointcut-ref="pointcut",切点我们指定前面配置的,id是pointcut。然后就要指定方法method了,这个方法是哪个类中的方法呢?还记得我们再配置<aop:aspect>时指定的bean吗?ref指定了myAspect,那么method指定的方法就是myAspect这个bean中的方法。这里我们配置putonshoes方法。

好了,到这里,aop的配置就全部配置完了,我们看一下全貌吧,

<bean id="myAspect" class="com.example.springaopdemo.aspect.MyAspect" />

<aop:config proxy-target-class="true">
<aop:aspect id="aspect" ref="myAspect">
<aop:pointcut id="pointcut"
expression="execution(* com.example.springaopdemo.service.*.*(..))">
</aop:pointcut>
<aop:before method="putonshoes" pointcut-ref="pointcut"></aop:before>
</aop:aspect>
</aop:config>

最后,我们在SpringBoot的启动类中,使用@ImportResource("spring-aop.xml") 引入这个xml文件,如下:

@SpringBootApplication
@ImportResource("spring-aop.xml")
public class SpringAopDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAopDemoApplication.class, args);
}
}

测试类的程序和上一篇是一致,没有变化,如下:

@SpringBootTest
class SpringAopDemoApplicationTests {
@Autowired
private MyService myService; @Test
public void testAdvice() {
myService.gotorun();
}
}

运行一下看看结果,

我穿上跑步鞋。
我要去跑步!

没有问题,符合预期。

在上一篇中,我们可以使用简单的配置,也就是不配置切点,在通知中直接配置匹配表达式,如果忘记的同学可以翻一翻上一篇的内容。在xml的aop配置中,也是可以省略掉切点pointcut的配置的,我们在通知中,直接配置表达式,如下:

<aop:config proxy-target-class="true">
<aop:aspect id="aspect" ref="myAspect">
<aop:before method="putonshoes"
pointcut="execution(* com.example.springaopdemo.service.*.*(..))">
</aop:before>
</aop:aspect>
</aop:config>

是不是比前面的配置看起来清爽一些了。小伙伴们自己运行一下吧,结果是没有问题的。

好了,Spring AOP的Java Config和Schema-based 两种的方式的配置都介绍完了。我们拓展一下思维,Spring的事务管理也是AOP吧,在方法执行之前打开事务,在方法执行后提交事务。但是大家有没有留意,Spring的事务配置和咱们的AOP配置是不一样的,这是为什么呢?咱们下一篇再聊吧。

温故知新——Spring AOP(二)的更多相关文章

  1. 代理模式及Spring AOP (二)

    一.Spring AOP   1.1 Spring AOP 底层还是用的动态代理.如果目标对象所对应的类有接口,spring就用jdk生成代理对象: 如果目标对象所对应的类没有接口,spring就用C ...

  2. Spring AOP(二)--注解方式

    本文介绍通过注解@AspectJ实现Spring AOP,这里要重点说明一下这种方式实现时所需的包,因为Aspect是第三方提供的,不包含在spring中,所以不能只导入spring-aop的包,为了 ...

  3. 温故知新——Spring AOP

    Spring AOP 面向切面编程,相信大家都不陌生,它和Spring IOC是Spring赖以成名的两个最基础的功能.在咱们平时的工作中,使用IOC的场景比较多,像咱们平时使用的@Controlle ...

  4. Spring AOP (二)

    下面介绍@AspectJ语法基础 一.切点表达式函数 AspectJ的切点表达式由关键字和操作参数组成,如execution(* greetTo(..)) 的切点表达式,execution为关键字,而 ...

  5. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  6. Spring技术内幕:Spring AOP的实现原理(二)

    **二.AOP的设计与实现 1.JVM的动态代理特性** 在Spring AOP实现中, 使用的核心技术时动态代理.而这样的动态代理实际上是JDK的一个特性.通过JDK的动态代理特性,能够为随意Jav ...

  7. spring学习(二) ———— AOP之AspectJ框架的使用

    前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...

  8. 深入理解Spring AOP之二代理对象生成

    深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 ...

  9. spring AOP 之二:@AspectJ注解的3种配置

    @AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...

随机推荐

  1. MYSQL的事物四大特性

    MYSQL的事物四大特性(ACID) 1.什么是事物? 事务(Transaction)是并发控制的基本单位.所谓的事务,它是由单独单元的一个或者多个sql语句组成,在这个单元中,每个mysql语句是相 ...

  2. 因为不知道Java的CopyOnWriteArrayList,面试官让我回去等通知

    先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章. ...

  3. PHP array_replace_recursive() 函数

    实例 递归地使用第二个数组($a2)的值替换第一个数组($a1)的值: <?php$a1=array("a"=>array("red")," ...

  4. SpringBoot注解综合

    SpringBoot注解综合 @Bean 注解通常会应用在一些配置类(由@Configuration注解描述)中,用于描述具备返回值的方法,然后系统底层会通过反射调用其方法,获取对象基于作用域将对象进 ...

  5. C/C++编程笔记:C语言自增(++)和自减(--)运算符详解,笔记分享

    一个整数类型的变量自身加 1 可以这样写: a = a + 1; 或者 a += 1; 不过,C语言还支持另外一种更加简洁的写法,就是: a++; 或者 ++a; 这种写法叫做自加或自增,意思很明确, ...

  6. 牛客挑战赛40 VMware和基站 set 二分 启发式合并 区间覆盖

    LINK:VMware和基站 一道 做法并不常见的题目 看起来很难写 其实set维护线段就可以解决了. 容易想到 第二个操作借用启发式合并可以得到一个很不错的复杂度 不过利用线段树维护这个东西 在区间 ...

  7. springboot2.1.x版本报错总结

    我使用的是springboot  2.1.7.RELEASE  springcloud  Greenwich.SR2 boot和cloud对应的版本号不能搞混,对应版本请参考https://sprin ...

  8. 使用javaScript 取cookie时需要注意的

    function getCookie(name) { var cookies = window.top.document.cookie.split('; ');//分号后面有个空格 for (var ...

  9. tracebace用法

    介绍一下traceback 平时看到的程序的错误信息也就是traceback信息 举个简单例子: import traceback try: s = [1, 2, 3] print s[5] exce ...

  10. 面经手册 · 第2篇《数据结构,HashCode为什么使用31作为乘数?》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在面经手册的前两篇介绍了<面试官都问我啥>和<认知自己的技术栈盲区 ...