Spring AOP 的一些认识
OOP 都还搞不清楚, AOP 又杀出来.
AOP 只是一个规范. AOP 联盟也只给出了一些接口. Spring 里面有自己的一套实现.
学习时对于一些名词像 advice, pointcut 等等千万不要看中文翻译, 意思不准确也没有规范统一.
《Without EJB》这本书确实不错, 但是不太适合专门用来入门.
- AOP 的概念就和 OOP 一样难以概括, 我来解释得通俗一点应该是: 在 目标方法 执行 之前 ( 之后 / 之前和之后 ) 调用 ( 插入 ) 附加方法. 这样的时候就应该使用 AOP 把它切开, 不然就算把 "附加方法" 抽象出来也得在 "目标方法" 前 ( 后 / 前和后 ) 手动调用.
- 很自然, 我们需要定义 "调用什么方法" 和 "在什么时候调用", 也就是所谓的 advice 和 pointcut.
- Spring 把这两个东西组合成一个 advisor 来使用. 有时候可能指定了 advice 而不指定 pointcut, 实际上是默认委托了一个匹配所有方法的 pointcut 来组成 advisor.
- advice 分 before, after, around 等等, before 和 after 都不能改变 目标方法 的返回值. around 是最强大的一种, 在 Spring 中为 Interceptor , 它甚至可以改变整个 目标方法! 常用的是这个.
- pointcut 内有 CalssFilter 和 MethodMatcher 分别过滤类和匹配方法. 方法匹配分动态和静态. 静态的可以一次匹配后缓存, 更高效; 动态的还可以匹配参数, 更灵活. 匹配时可以使用正则表达式.
- 接下来就是 proxy , 也是我们最终去使用的东西. 这个也是 Spring 自己的东西. 这里有个地方需要理解, 虽然实现类是某个 ProxyFactoryBean, 但是我们引用后得到的却是 target 指定的目标类的实例, 并且已经将方法都按规则植入了, 相当于生成一个新的子类以供使用.
- 这里面还分 JDK 动态代理和 CGLIB 代理两种. JDk 只能代理实现了接口的类, 此 proxy 是在运行时动态判断, 所以有一定的开销. 但是它可以不需要遵守一些规则, 比如 final 方法也可以被改变. 而 CGLIB 是在字节码翻译期就直接生成新的子类来使用, 所以不能为 final 方法代理. Spring 默认 CGLIB.
所以, 要使用 Spring 的 AOP. 应该是:
- proxy: 指定 target, 为我们的目标类的接口. 指定一些 interceptor.
- 一些 interceptor: 指定 advice 和 pointcut.
请同学们指正.
------- 本命的分割线 -------
本命年终于过了, 希望以后能顺一点.
溜溜说的对, 等不到公车并不是公车和和谐社会的问题, 而是自己的问题. 你可以早点起来赶上一趟车, 也可以挤一挤其他的车, 更应该努力工作自己买车.
努力, 奋斗!


0 个回复:
发表评论