什么是AOP
- AOP,叫做面向切面编程,也就是将通用处理(日志、权限)封装成切面,跟业务逻辑进行分离
作用
- 降低系统耦合度,将通用处理和业务逻辑代码进行分离,可以不修改业务代码实现方法的增强
- 实现代码复用,将通用处理封装成切面,方便其他方法拿来即用
静态代理(了解即可)
含义:在编译期对类进行增强,可以自己手写代理类增强,也可以使用AspectJ等框架
缺点:1. 不灵活,如果代理类和目标类共同接口添加了方法,我还要在代理类实现这个方法
2.类爆炸,如果要增强100个目标类,静态代理就要写100个增强类,但是动态代理可能两行代码就能实现
动态代理(重要)
-
含义:使用反射在程序运行时动态生成代理类对目标进行增强
-
具体实现:
- JDK动态代理(基于接口实现)
- CGLIB动态代理(基于继承实现)
-
使用限制(也可以理解为JDK和CGLIB的缺点):
- 如果目标类实现了接口,就可以用JDK或者CGLIB
- 如果目标类没有实现接口,只能用CGLIB
- 如果目标类用final修饰,表示不可继承,就不能用CGLIB动态代理
-
效率问题:在jdk1.8中,JDK动态代理速度要快于CGLIB动态代理。
-
应用:当我们为某个Bean配置了切面后,这个Bean就被加载到容器中,实际加载的是这个Bean的代理对象而不是原始Bean。在Spring中,如果这个Bean有接口,就使用JDK动态代理,否则使用CGLIB动态代理。
如何使用
记住三个关键点:切入点,通知,切面
AOP主要解决的就是三件事:
- Pointcut切入点:对哪个方法进行增强
- Advice通知:对方法什么时候增强,比如说执行前,执行后,环绕增强
- 做哪些增强,看业务需要 还有一个Aspect切面,java中万物皆对象,需要一个封装切面的类就是切面,包含切入点和通知