谈谈你对AOP的理解

AOP(Aspect Oriented Programming面向切面编程),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入,在不修改源码的基础上,还能对源码进行前后增强。

AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理,

3. AOP 的代理有哪几种方式?

JDK 动态接口代理

JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类: Proxy 和 InvocationHandler 。 InvocationHandler 是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动 态将横切逻辑和业务逻辑编制在一起。Proxy 利用 InvocationHandler 动态创建一个符合某一接口的实 例,生成目标类的代理对象。

CGLib 动态代理

  1. : CGLib 全称为 Code Generation Library ,是一个强大的高性能,高质量的代码生成类库,可以 在运行期扩展 Java 类与实现 Java 接口, CGLib 封装了 asm ,可以再运行期动态生成新的 class 。 和 JDK 动态代理相比较: JDK 创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通 过接口定义业务方法的类,则可以通过 CGLib 创建动态代理。

4. 怎么实现 JDK 动态代理?

1.创建需要代理的类对象

2.创建InvocationHandler代理类对象

3.创建代理对象

4.通过代理执行方法

//创建代理对象,使用Proxy
//1.创建目标对象(创建需要代理的类对象)
//UsbKingFactory foctory = new UsbKingFactory();
UsbSell foctory = new UsbKingFactory();

//2.创建InvocationHandler对象
InvocationHandler handler = new MySellHandler(foctory);

//3.创建代理对象
UsbSell proxy=(UsbSell) Proxy.newProxyInstance(foctory.getClass().getClassLoader(), foctory.getClass().getInterfaces(),handler);

//4.通过代理执行方法
float price = proxy.sell(1);
System.out.println("通过动态代理对象,调用方法;"+price);

5. AOP 的基本概念:切面、连接点、切入点等?

术语含义
目标(Target) 被通知的对象
代理(Proxy) 向目标对象应用通知之后创建的代理对象
连接点(JoinPoint) 目标对象的所属类中,定义的所有方法均为连接点
切入点(Pointcut) 被切面拦截 / 增强的连接点(切入点一定是连接点,连接点不一定是切入点)
通知(Advice) 增强的逻辑 / 代码,也即拦截到目标对象的连接点之后要做的事情
切面(Aspect) 切入点(Pointcut)+通知(Advice)
Weaving(织入) 将通知应用到目标对象,进而生成代理对象的过程动作
posted @ 2022-08-23 11:26  我来偷家了  阅读(242)  评论(0编辑  收藏  举报