美文网首页Java架构技术进阶
还搞不定生涩难懂的Spring Aop?梳理完毕原来如此简单

还搞不定生涩难懂的Spring Aop?梳理完毕原来如此简单

作者: 今天你敲代码了吗 | 来源:发表于2020-08-17 15:42 被阅读0次

    今天学习内容安排如下:

    • 切面配置的核心三步骤。
    • 传统sprin配置和AspectJ配置都学下,xml和注解都使用下。
    • 同时为了测试,补充说明一下spring的junit集成,几天前没来得及学的知识点。

    一、传统Spring AOP编程

    这种方式在现在的开发中基本不会使用,但为了更好地和AspectJ对比还是做一个了解。

    1切面编程开发三步骤

    ①确定要增强的target对象

    也就是哪些类需要增强?对spring来说,目标就是bean对象。

    ②配置增强

    Advice通知,也就是我们要增强一个什么功能,会在②对应的类中说明。

    ③配置切入点

    即要拦截的连接点有哪些(方法)

    • id="myPointcut":切入点唯一标识。

    • expression表达式:匹配方法的。

    expression=bean(*Service)表示在spring容器中,所有id/name以Service结尾的bean都能被拦截。

    ④配置切面

    也就是:要对哪些方法(pointcut),进行怎样的增强?(advice)

    • advice-ref="timeLogAdvice",即对应怎样的增强。
    • pointcut-ref="myPointcut",即对应哪些方法需要增强。

    2编写传统aop的Advice通知类

    ①环绕通知

    通知主要有四类,即增强的位置:

    • 前置通知MethodBeforeAdvice:在目标方法执行前实施增强。

    • 后置通知AfterReturningAdvice:在目标方法执行后实施增强。

    • 环绕通知MethodInterceptor:在目标方法执行前后实施增强。

    • 异常抛出通知ThrowsAdvice:在方法抛出异常后实施增强。

    在这里因为我们需要在方法前后实施增强,所以我们使用环绕通知,需要实现对应接口。

    注意:接口不要弄混淆了,是org.aoplliance中的接口,不是cglib中的。

    ②invoke方法

    参数为Methodinvocation。

    ③调用目标对象的方法

    这个就相当于method.invoke()。

    ④记录日志

    这个涉及到日志配置文件的编写。

    3使用spring的junit集成测试

    ①@RunWith注解和@ContextConfiguration注解

    • 通过@RunWith注解,使用junit整合spring。
    • 通过@ContextConfiguration注解,指定spring容器的位置。

    ②@Autowired注解

    通过@Autowired注解,注入需要测试的对象,在这里注意2点:

    • 将测试对象注入到测试用例中。
    • 测试用例不需要配置<context:annotion-config/>,因为使用测试类运行的时候,会自动启动注解的支持。

    ③调用测试方法完成测试

    二、Aspectj(xml)配置AOP

    上述传统方法中需要实现对应的通知接口,而在Aspectj中就不需要了。

    1Xml配置AOP开发方法还是三步

    • 确定要增强谁?(bean)
    • 确认增强什么功能?(通知advice)
    • 确定需要增强的方法有哪些?(切入点pointcut)

    而如何将它们对应起来就需要配置切面了。

    ①②③和传统的配置是一样的,不再赘述,只说不同的地方。

    ④配置切面

    通知是有好几种的,重点也就是这个通知类型,将其弄懂了,xml和注解也就简单了:

    • aop:before也就是前置通知。
    • aop:after-returning也就是后置通知。
    • aop:around 也就是环绕通知。
    • aop:after-throwing也就是抛出通知。
    • aop:after也就是最终通知。

    method:通知类中的方法名;pointcut-ref="myPointcut":注入切入点。

    2通知类的编写

    因为测试方法和上述是差不多的,所以不再赘述,将测试结果放在一起说明:

    配置文件中给指定方法设置通知的类型,beforeTest方法就是前置通知。

    增强CustomerServiceImpl类中的所有方法,前置通知就相当于在对应方法之前执行增强的功能。

    joinPoint就是连接点,在这里也就是目标对象中的所有方法,该参数是一个可选参数,其有三个常用的方法:

    • getSignature()方法:获取目标对象中的方法。
    • getThis()方法:获取的是代理对象。
    • getTarget()方法:获取的也就是目标对象。

    我这边只说明一下前置通知,其它的基本上都是大同小异的。

    不过每个通知都有自己的应用场景,这个以后遇到具体的场景了再说明。

    我会在以后做一个其对应的应用合集。

    三、Aspectj注解配置AOP

    会了xml,注解就真心很简单了。

    1配置xml文件

    ①配置注解扫描

    ②配置aspectj的自动代理机制

    设置好这两个标签之后,就可以全部都使用注解配置AOP了

    2通知类的编写

    ①确认目标对象

    用注解将该类放入spring容器中。

    ②确认增强的功能

    @Aspect注解即表示,将其作为aop管理。

    ③环绕通知

    ProceedingJoinPoint是环绕通知中的一个参数,翻译过来就是可执行的连接点的意思。

    通过该参数调用proceed()方法就相当于执行原目标对象中的方法。

    ④抛出通知

    这个是如果出现了异常,就会执行该增强功能,也就相当于try…catch。

    当然还有其它几种通知:

    • @Before前置通知,相当于BeforeAdvice。

    • @AfterReturning后置通知,相当于AfterReturningAdvice。

    • @After最终final通知,不管是否异常,该通知都会执行。

    最后

    AOP这块的知识点有点生涩难懂,
    只能说目前来说所追求的还是一个学习进度,保证每天都有输出,至于质量问题只能留待以后一点点优化了。

    大家看完有什么不懂的可以在下方留言讨论也可以关注.
    谢谢你的观看。
    觉得文章对你有帮助的话记得关注我点个赞支持一下!

    链接:https://juejin.im/post/6861541857713897486

    相关文章

      网友评论

        本文标题:还搞不定生涩难懂的Spring Aop?梳理完毕原来如此简单

        本文链接:https://www.haomeiwen.com/subject/dscqjktx.html