本文已参与「新人创作礼」活动,一起开启掘金创作之路。
什么是AOP?
AOP 是面向切面编程,是一种开发理念,通过动态代理的方式为程序添加统一的功能。
为什么要引入 AOP?
Java OOP 存在哪些局限性?
- 静态化语言:类结构一旦定义,不易修改。
- 侵入性扩展:通过继承或组合来扩展功能都是侵入性的(需要改变源代码)。
AOP的优点:
- 抽离非业务逻辑的代码(比如安全检查、监控),使原方法更专注于业务逻辑。
- 各个步骤之间隔离性良好,大大降低耦合度 。
- 非侵入性扩展,扩展功能时不对源码进行修改。
AOP 的实现原理?动态代理的方式有哪些?
AOP 使用动态代理实现,不需要修改源代码,而是在内存中动态生成一个 AOP 对象,这个 AOP 对象包含了目标对象的全部方法,并且在特定的切入点进行了增强处理 。
Spring AOP的动态代理有两种方式,JDK 动态代理和 CGLIB(Code Generation Library)动态代理。
(1)JDK 动态代理:基于接口实现,代理类必须实现InvocationHandler 接口 并通过Proxy 类 的newProxyInstance方法生成动态代理对象。传入(类加载器,目标类实现的接口、InvocationHandler接口参数)
(2)CGLIB动态代理:CGLIB是用于代码生成的类库,通过继承的方式实现动态代理,运行时动态的生成目标类的子类,被final修饰的类无法进行CGLIB 动态代理。
优先使用JDK动态代理,效率高,若代理类没有实现InvocationHandler 接口会自动使用 CGLIB 来动态代理目标类 ,也可以强制使用CGLIB动态代理。
简述 AOP 的使用场景?
事务管理、安全检查、权限控制、数据校验、缓存等
简述 Spring AOP 中比较重要的概念
在 Spring AOP 中有以下几个概念:
- Join point:连接点,是类中可以被增强的方法。
- Pointcut:切入点,类中实际被增强的方法,AspectJ 中包含哪些 Join point 需要由 Pointcut 筛选。
- Advice:通知,实际增强的逻辑部分,是切面中的横切逻辑,有前置、后置、异常、环绕、最终通知。
- AspectJ:切面,把通知应用到切入点过程。