Aop demo

Posted Xuuuuu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Aop demo相关的知识,希望对你有一定的参考价值。

之前在学习 spring 的时候,在 spring 实战中看到了「AOP」,也就是切面。当时是第一次接触这个新概念,所以用了很多的时间去理解其中的术语,和相关的用法。在前面的文章中,也介绍了一些 和 AOP 相关的。过了这么久,终于想起来写一个 demo 给大家 look look。


项目构建

在构建项目时,推荐使用 IDEA,因为这个软件真的好用的一批。

在 IDEA 中构建一个 Maven 项目,并在项目中构建 class、xml 以及测试类。项目结构如下图


代码展示

pom.xml 

 1<dependencies>
2    <!--服务依赖-->
3    <dependency>
4        <groupId>javax.servlet</groupId>
5        <artifactId>javax.servlet-api</artifactId>
6        <version>3.1.0</version>
7        <scope>provided</scope>
8    </dependency>
9    <!--测试依赖-->
10    <dependency>
11        <groupId>junit</groupId>
12        <artifactId>junit</artifactId>
13        <version>4.11</version>
14        <scope>test</scope>
15    </dependency> 
16    <!--Spring和aop相关依赖-->
17    <dependency>
18        <groupId>org.springframework</groupId>
19        <artifactId>spring-core</artifactId>
20        <version>4.0.5.RELEASE</version>
21    </dependency>
22    <dependency>
23        <groupId>org.springframework</groupId>
24        <artifactId>spring-beans</artifactId>
25        <version>4.0.5.RELEASE</version>
26    </dependency>
27    <dependency>
28        <groupId>org.springframework</groupId>
29        <artifactId>spring-context</artifactId>
30        <version>4.0.5.RELEASE</version>
31    </dependency>
32    <dependency>
33        <groupId>org.springframework</groupId>
34        <artifactId>spring-aop</artifactId>
35        <version>4.0.5.RELEASE</version>
36    </dependency>
37    <!--aspectj依赖-->
38    <dependency>
39        <groupId>org.aspectj</groupId>
40        <artifactId>aspectjweaver</artifactId>
41        <version>1.8.1</version>
42    </dependency>
43
44</dependencies>


class 代码

 1public class Book {
2  // 连接点(Joinpoint)。类里面可以被增强的方法,这些方法称为连接点
3  public void add() {
4      System.out.println("add...........");
5  }
6}
7public class MyBook {
8  //这些都是通知(Advice)
9  public void before1() {
10      System.out.println("前置增强......");
11  }
12
13  public void after1() {
14      System.out.println("后置增强......");
15  }
16
17  //环绕通知
18  public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
19   //方法之前
20   System.out.println("方法之前.....");
21
22   //执行被增强的方法
23   proceedingJoinPoint.proceed();
24
25   //方法之后
26   System.out.println("方法之后.....");
27  }
28}


aop.xml

 1<!--配置 Bean-->
2<bean id="book" class="com.xuuuuu.aopdemo.Book"/>
3<bean id="myBook" class="com.xuuuuu.aopdemo.MyBook"/>
4
5<!--配置 AOP-->
6<aop:config>
7    <!--配置切入点-->
8    <aop:pointcut id="pointcut1" expression="execution(* com.xuuuuu.aopdemo.Book.*(..))"/>
9    <!--配置切面,把增强用到方法上-->
10    <!--切面:把增强应用到具体方法上面的过程称为切面。-->
11    <aop:aspect ref="myBook">
12        <!--配置增强类型 method;增强类里面使用哪个方法作为前置-->
13        <aop:before method="before1" pointcut-ref="pointcut1"/>
14        <aop:after-returning method="after1" pointcut-ref="pointcut1"/>
15        <aop:around method="around1" pointcut-ref="pointcut1"/>
16    </aop:aspect>
17</aop:config>


AopTest

 1public class AopTest {
2  @Test
3  public void testService() 
{
4    //通过XML文件加载程序配置
5    ApplicationContext context = new ClassPathXmlApplicationContext("aop.xml");
6    //获取 bean。id 默认为第一个字母为小写的类的名称 
7    Book book = (Book) context.getBean("book");
8    //调用切点方法
9    book.add();
10  }
11}


代码分析

1、我们通过 pom.xml 引入项目所需要的依赖;


2、在 MyBook.class 中,我们定义了前置通、后置通知方法;为了方便,我们定义了一个环绕方法「around1」,它可以按照方法里面的代码顺序执行方法,在要正式执行切点方法时,我们就会调用「proceedingJoinPoint.proceed()」方法来执行切点方法。


3、在 Book.class 中写我们想定义的切点方法。当程序运行这个切点方法「add()」时,我们定义的与切点方法相关联的切面方法就会被程序自动调用。


4、切点和切面都定义好后,我们就在 aop.xml 中告诉 Spring 我们要装配的 Bean;并且指定切点、前置通知、后置通知以及环绕通知,如果还有异常通知的话,也需要在其中指定。


AOP 配置好后,在 IDEA 中就是这样的,我们点击左边的图标,IDEA 就会跳转到相应的文件中。

Aop demo

运行结果如下图


PS:点击阅读原文即可查看项目代码


推荐阅读


以上是关于Aop demo的主要内容,如果未能解决你的问题,请参考以下文章

spring aop demo

Spring Boot AOP Demo

iOS架构:AOP实现局部模块化(附Demo)

Spring AOP四种实现方式Demo详解与相关知识探究

Spring AOP四种实现方式Demo详解与相关知识探究

Unity容器的简单AOP与DI的应用Demo