Spring AOP,面向切面编程,是spring中的一个重要概念。
首先要具体地解释一些面向切面编程的具体内涵。然后结合spring,讲讲面向切面编程在spring中是干嘛的,以及面向切面编程的实现原理,即动态代理。会有相关的文章解释动态代理,以及用java动态代理模拟spring。
spring中两种动态代理的方式,一是默认Spring AOP,默认基于java动态代理,另一个是AspectJ方式。
听起来很抽象。举个例子
很多时候, 我们需要在某些功能执行前后执行一些功能.
比如说说, 现在有个方法 login(), 实现了登陆的功能. 我们需要在这个方法前后加一些功能, 比如
方法执行前: 检查权限
方法执行中: 抓取日志
方法执行后: 记录时间
要求是不改变login本身的方法体. 那么该怎么办?
我们很容易就想到代理. 比如
比如以下, 给登陆模块套一层, p.login()调用前后干我们想干的事.
class 登陆模块{
login(){...}
}
class 登陆模块代理proxy{
登陆模块 p;
login(){
检查权限();
p.login();
记录时间();
}
}
以上. 在web应用中, 像这种需求是普遍存在的, 而且是类似的, 比如检查权限这个功能, 可能会在所有方法前我都想调用, 记录时间这个功能, 可能在所有方法后我都想调用.
一个很形象的想象是, web应用是功能多个这样的小功能模块的整合
形象地, 权限检查模块和记录时间模块就是切面.
脱离spring来说, 面向切面编程就是编写这些贯穿所有核心业务的辅助业务框架, 而且其实大多数辅助业务都是可复用的, 所以对于我们来说, 在某种意义上仅仅需要关注, 核心业务的编写. 简化了开发.
再进一步, 面向切面编程, 实际上解决的就是我们想在核心业务(方法)前后批量地添加方法, 本质上就是上面提到的代理.
但问题在于, 我们不能一个核心业务就写一个代理吧, 那就太麻烦了. 所以----
从我们把创建对象, 初始化对象, 对象依赖建立交给spring之后, 这又进一步运用spring作为框架, 简化我们的开发. 目的是, 把辅助业务和核心业务的编织----生成proxy这件事交给spring, 我们只需要告诉它, 谁和谁要编制在一起就行了.
核心的原理是java的反射机制以及动态代理机制.
反射机制说白了就是将创建, 调用等等行为封装成对象, 可能有点抽象, 其实就是完成这样一件事 : 用字符串的形式给出类名, 方法名, 从而新建对象和调用方法. 用处在于, 我们可以通过配置文件, 只声明类名, 方法名, 而使得某套代码使用该类该方法, 新建调用. 最终, 我们若想改变类, 改变方法, 仅需要动配置文件, 而不需要动代码.
这也就是解耦了. 还是不懂的话, 还得取看看反射机制, 很简单的, 也没什么, 但是被广泛使用. 总之就是使得"配置文件动态编程"这件事成为可能, 这也是几乎所有框架的基本逻辑.
参考动态代理的两篇文章, 第一篇是动态代理设计模式本身. 第二篇是用java反射机制和动态代理机制模拟spring的一些工作. 参考<动态代理>, 及<用反射及动态代理模拟Spring>
Spring中的动态代理有两种实现, 一种是基于java动态代理的spring aop的实现, 另一种则是GCLIB. 两种其实差不多. 这里只详细描述java动态代理的原理, 及模拟实现.
同样不谈demo, 只总结相关的重要概念的理解. 参考文章
Spring 中面向切面编程的实现主要两个, 一个是基于上述动态代理的Spring AOP, 也是默认实现, 另一个是AspectJ.
语法参考手册就好了, 编写spring我目前觉得重点就是对这些概念的理解.