详细解读 Spring AOP 面向切面编程(二)
程序员文章站
2022-07-04 08:43:24
本文是《详细解读 Spring AOP 面向切面编程(一)》的续集。 在上篇中,我们从写死代码,到使用代理;从编程式 Spring AOP 到声明式 Spring AOP。一切都朝着简单实用主义的方向在发展。沿着 Spring AOP 的方向,Rod Johnson(老罗)花了不少心思,都是为了让我 ......
本文是《详细解读 spring aop 面向切面编程(一)》的续集。
在上篇中,我们从写死代码,到使用代理;从编程式 spring aop 到声明式 spring aop。一切都朝着简单实用主义的方向在发展。沿着 spring aop 的方向,rod johnson(老罗)花了不少心思,都是为了让我们使用 spring 框架时不会感受到麻烦,但事实却并非如此。那么,后来老罗究竟对 spring aop 做了哪些改进呢?
现在继续!
9. spring aop:切面
之前谈到的 aop 框架其实可以将它理解为一个拦截器框架,但这个拦截器似乎非常武断。比如说,如果它拦截了一个类,那么它就拦截了这个类中所有的方法。类似地,当我们在使用动态代理的时候,其实也遇到了这个问题。需要在代码中对所拦截的方法名加以判断,才能过滤出我们需要拦截的方法,想想这种做法确实不太优雅。在大量的真实项目中,似乎我们只需要拦截特定的方法就行了,没必要拦截所有的方法。于是,老罗同志借助了 aop 的一个很重要的工具,advisor(切面),来解决这个问题。它也是 aop 中的核心!是我们关注的重点!
也就是说,我们可以通过切面,将增强类与拦截匹配条件组合在一起,然后将这个切面配置到 proxyfactory 中,从而生成代理。
这里提到这个“拦截匹配条件”在 aop 中就叫做 pointcut(切点),其实说白了就是一个基于表达式的拦截条件罢了。
归纳一下,advisor(切面)封装了 advice(增强)与 pointcut(切点 )。当您理解了这句话后,就往下看吧。
我在 greetingimpl 类中故意增加了两个方法,都以“good”开头。下面要做的就是拦截这两个新增的方法,而对 sayhello() 方法不作拦截。