什么是 AOP?
AOP 是一种思想,是 Aspect-oriented-programing(面向切面编程)的意思。AOP 可以将业务逻辑与系统级服务隔离,使业务逻辑跟各个系统级服务的耦合度降低,提高程序的通用性和开发效率。
ps:这里先简单的引一下概念,更详细的解释请一定仔细往下阅读。
什么是业务逻辑?什么是系统级服务?
那什么叫业务逻辑,什么叫系统级的服务呢?
- 业务逻辑:某个类某个方法本身要实现的功能,比如:我有一个 saveUser 方法,这个方法负责新增用户,那么这个新增用户的功能就是 saveUser 的业务逻辑。
- 系统级服务:比如系统日志,权限验证。
- 系统日志:比如我新增了一个用户,然后向日志表中插入一条记录;我删除了一个用户,然后向日志表中删除一条记录…类似这样的贯穿于整个系统中业务逻辑的功能就叫系统级服务。记录日志一般在功能执行完毕之后进行日志记录。
- 权限验证:比如我删除一个部门,那么在删除功能执行之前要验证这个用户是否有权限执行删除操作;删除一个菜单,那么在删除之前要验证这个用户是否有权限删除这个菜单…**像这样的也是贯穿于整个系统中的业务逻辑的功能也叫系统级服务。 ** 权限验证一般是在方法的业务功能之前执行。
为什么要采用 AOP 这种思想?
在没有使用 AOP(面向切面编程) 的情况下进行权限验证和记录系统日志就不得不在每个方法里加上一行权限验证的代码,一行记录系统日志的代码,…假如说我这个系统 1000 个类,每个类的每个方法都加上这么几行代码,可想而知,代码量会相当庞大,万一哪个系统级服务的方法调用错了,要改就要改一片,工作量也就上来了,代码的维护成本也就上来了。
使用了 AOP 这种思想之后,我们只需要创建一个类,在这个类中编写系统级服务,然后采用某种方式,把这些系统级服务织入到我们所需的方法中即可。
举个栗子:
没有使用 AOP 这种思想的时候,村支书要向村民通知个事情就需要挨家挨户的敲门通知,在使用了 AOP 这种思想的时候,村支书只需要拿个大喇叭一喊每家每户都能听到,这样一来村支书就方便了很多,就可以把时间节省下来去干别的事。
其实上面的村支书就是我们程序猿,村支书去通知事情其实就是程序猿在编写系统级服务,没有采用 AOP 这种思想的时候,程序猿就得给每个业务功能里面加系统级服务的代码,但是有了 AOP 就只需要对着喇叭喊一次,所有的业务逻辑里面都嵌入了系统级服务,实现了一次编写,处处使用。
那么如何实现 AOP 这种思想呢?
主要有两种方式:一种是静态织入,一种是动态代理。
静态织入
静态织入发生在字节码生成时根据一定框架的规则提前将 AOP 字节码插入到目标类和方法中,在程序运行的时候调用目标类的方法来实现 AOP。
动态代理
动态代理就是在JVM运行过程中,动态的生成目标类的字节码文件(就是 .class 文件),在里面织入(就是写入,形象一点的说法)所需的代码(系统级服务),进而调用代理对象的方法来执行系统级服务,进而就实现了 AOP。
这里主要介绍一下动态代理,因为在 Spring 中就是通过动态代理实现的 AOP。
动态代理主要分为两种:JDK 的动态代理,CGLIB 的动态代理。
-
JDK 的动态代理:
主要依赖的是 java.lang.reflect 包下的 Proxy 的 newProxyInstance 方法来创建一个目