当前位置:网站首页 > Java教程 > 正文

java编程教程aop



廖雪峰
资深软件开发工程师,业余马拉松选手。

在AOP编程中,我们经常会遇到下面的概念:

  • Aspect:切面,即一个横跨多个核心逻辑的功能,或者称之为系统关注点;
  • Joinpoint:连接点,即定义在应用程序流程的何处插入切面的执行;
  • Pointcut:切入点,即一组连接点的集合;
  • Advice:增强,指特定连接点上执行的动作;
  • Introduction:引介,指为一个已有的Java对象动态地增加新的接口;
  • Weaving:织入,指将切面整合到程序的执行流程中;
  • Interceptor:拦截器,是一种实现增强的方式;
  • Target Object:目标对象,即真正执行业务的核心逻辑对象;
  • AOP Proxy:AOP代理,是客户端持有的增强后的对象引用。

看完上述术语,是不是感觉对AOP有了进一步的困惑?其实,我们不用关心AOP创造的“术语”,只需要理解AOP本质上只是一种代理模式的实现方式,在Spring的容器中实现AOP特别方便。

我们以和为例,这两个属于核心业务逻辑,现在,我们准备给的每个业务方法执行前添加日志,给的每个业务方法执行前后添加日志,在Spring中,需要以下步骤:

首先,我们通过Maven引入Spring对AOP的支持:

  • org.springframework:spring-aspects:6.0.0

上述依赖会自动引入AspectJ,使用AspectJ实现AOP比较方便,因为它的定义比较简单。

然后,我们定义一个:

观察方法,我们定义了一个注解,后面的字符串是告诉AspectJ应该在何处执行该方法,这里写的意思是:执行的每个方法前执行代码。

再观察方法,我们定义了一个注解,它和不同,可以决定是否执行目标方法,因此,我们在内部先打印日志,再调用方法,最后打印日志后返回结果。

在类的声明处,除了用表示它本身也是一个Bean外,我们再加上注解,表示它的标注的方法需要注入到的每个方法执行前,标注的方法需要注入到的每个方法执行前后。

紧接着,我们需要给类加上一个注解:

Spring的IoC容器看到这个注解,就会自动查找带有的Bean,然后根据每个方法的、等注解把AOP注入到特定的Bean中。执行代码,我们可以看到以下输出:

这说明执行业务逻辑前后,确实执行了我们定义的Aspect(即的方法)。

有些童鞋会问,定义的方法,是如何注入到其他Bean的呢?

其实AOP的原理非常简单。我们以为例,要把它注入到的每个方法中,最简单的方法是编写一个子类,并持有原始实例的引用:

这些都是Spring容器启动时为我们自动创建的注入了Aspect的子类,它取代了原始的(原始的实例作为内部变量隐藏在中)。如果我们打印从Spring容器获取的实例类型,它类似,实际上是Spring使用CGLIB动态创建的子类,但对于调用方来说,感觉不到任何区别。

可见,虽然Spring容器内部实现AOP的逻辑比较复杂(需要使用AspectJ解析注解,并通过CGLIB实现代理类),但我们使用AOP非常简单,一共需要三步:

  1. 定义执行方法,并在方法上通过AspectJ的注解告诉Spring应该在何处调用此方法;
  2. 标记和;
  3. 在类上标注。

至于AspectJ的注入语法则比较复杂,请参考Spring文档。

Spring也提供其他方法来装配AOP,但都没有使用AspectJ注解的方式来得简洁明了,所以我们不再作介绍。

顾名思义,拦截器有以下类型:

  • @Before:这种拦截器先执行拦截代码,再执行目标代码。如果拦截器抛异常,那么目标代码就不执行了;
  • @After:这种拦截器先执行目标代码,再执行拦截器代码。无论目标代码是否抛异常,拦截器代码都会执行;
  • @AfterReturning:和@After不同的是,只有当目标代码正常返回时,才执行拦截器代码;
  • @AfterThrowing:和@After不同的是,只有当目标代码抛出了异常时,才执行拦截器代码;
  • @Around:能完全控制目标代码是否执行,并可以在执行前后、抛异常后执行任意拦截代码,可以说是包含了上面所有功能。

使用AOP实现日志。

下载练习

在Spring容器中使用AOP非常简单,只需要定义执行方法,并用AspectJ的注解标注应该在何处触发并执行。

Spring通过CGLIB动态创建子类等方式来实现AOP代理模式,大大简化了代码。

版权声明


相关文章:

  • 软件java开发教程2024-11-30 16:58:02
  • java教程知乎2024-11-30 16:58:02
  • java教程哪个讲得好2024-11-30 16:58:02
  • java7安装教程2024-11-30 16:58:02
  • Java教程项目2024-11-30 16:58:02
  • java 程序案例教程2024-11-30 16:58:02
  • neo4j java 教程2024-11-30 16:58:02
  • java spring框架教程 pdf2024-11-30 16:58:02
  • 龙果学院java教程2024-11-30 16:58:02
  • java项目练手教程2024-11-30 16:58:02