图解JAVA中Spring Aop作用

 更新时间:2017年04月21日 08:54:09   作者:再写三行  
这篇文章主要介绍了Java的Spring框架下的AOP的作用,需要的朋友可以参考

假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如

1

但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。

2

但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。

通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置

插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。

3

为了在指定位置执行这些横向的功能,需要知道指定的是什么地方

4

例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是

通知类型 简介

Before(前置通知) 目标方法调用之前执行

After(后置通知) 目标方法调用之后执行

After-returning(返回通知) 目标方法执行成功后执行

After-throwing(异常通知) 目标方法抛出异常后执行

Around(环绕通知) 相当于合并了前置和后置

把切点和通知合在一起就是切面了,一个切面指定了在何时何地执行何种方法。在spring aop中如此定义这个切面:

@Aspect
@Component
public class UserAspect {

  @Before("execution(* com.aop.service.impl.UserServiceImpl.login(..))")
  public void loginLog(){
    System.out.println("user login");
  }

}

使用注解@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution表达式声明在这个切点,格式如下

5

第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,*号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是login,则是指定了该类中的login方法。然后最后一个参数是方法入参,因为Java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。

至此,我们就可以使用spring aop,但是还有两点需要得到注意

将切面类声明为一个bean

切点指定的方法所在的类也同样需由spring注入才能生效

希望本篇文章对您有所帮助

相关文章

  • POI对Excel自定义日期格式的读取(实例代码)

    POI对Excel自定义日期格式的读取(实例代码)

    下面小编就为大家带来一篇POI对Excel自定义日期格式的读取(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • java Hibernate save()与persist()区别

    java Hibernate save()与persist()区别

    本文章来给各位同学介绍一下Hibernate save()与persist()区别,希望此文章能对各位同学对于Hibernate save()与persist()有所理解
    2016-01-01
  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

    Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

    Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。国内又以Mybatis用的多,基于mybatis上的增强框架,又有mybatis plus和TK mybatis等。今天我们介绍一个新的mybatis增强框架 fluent mybatis关于项目工程化与常规操作流程
    2021-10-10
  • JSP 开发之hibernate的hql查询多对多查询

    JSP 开发之hibernate的hql查询多对多查询

    这篇文章主要介绍了JSP 开发之hibernate的hql查询多对多查询的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • java基础之TreeMap实现类全面详解

    java基础之TreeMap实现类全面详解

    这篇文章主要为大家介绍了java基础之TreeMap实现类全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • java 多线程饥饿现象的问题解决方法

    java 多线程饥饿现象的问题解决方法

    这篇文章主要介绍了java 多线程饥饿现象的问题解决方法的相关资料,需要的朋友可以参考下
    2017-06-06
  • JVM 的 noverify 启动参数问题解析

    JVM 的 noverify 启动参数问题解析

    这篇文章主要介绍了JVM 的 noverify 启动参数问题解析,从 JDK 13 开始及其后续版本中,不建议继续使用 -Xverify:none 和-noverify 参数,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Java JDK8新增Optional工具类讲解

    Java JDK8新增Optional工具类讲解

    这篇文章主要介绍了Java JDK8新增Optional工具类讲解,本文通过老版和jdk8对比对null的处理方式,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 静态方法中调用Spring注入过程解析

    静态方法中调用Spring注入过程解析

    这篇文章主要介绍了静态方法中调用Spring注入过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 如何使用hutool做本地缓存的工具类

    如何使用hutool做本地缓存的工具类

    这篇文章主要介绍了如何使用hutool做本地缓存的工具类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10

最新评论