AOP是什么?
与OOP对比,AOP是面向切面编程。传统OOP开发中,代码逻辑是至上而下的,过程中会出现一些横切性问题,这些横切性的问题和我们的主业务逻辑关系散落在代码的各个地方,造成难以维护,AOP的编程思想就是把业务逻辑和横切的问题进行分离,从而达到解耦的目的,使代码的重用性和开发效率高(目的是重用代码,把公共的代码抽取出来)
AOP的应用场景有哪些呢?
- 日志记录
- 权限验证
- 事务管理(spring 的事务就是用AOP实现的)
Spring Aop的底层是怎样实现的?
- JDK动态代理
- CGLIB代理
是编译时期进行织入,还是运行期进行织入?
运行期,生成字节码,再加载到虚拟机中,JDK是利用反射原理,CGLIB使用了ASM原理。
初始化的时候,已经将目标对象进行代理,放入到spring 容器中。
Spring AOP 默认使用jdk动态代理还是cglib?
要看条件,如果实现了接口的类,是使用jdk。如果没实现接口,就使用cglib。(能用 JDK 做动态代理就用 JDK,不能用 JDK 做动态代理就用 Cglib,即首选 JDK 做动态代理。)
jdk动态代理是jdk自带的,所以使用它不需要额外导入jar包,它是基于反射机制实现的,当需要代理的真实类继承了接口时,spring默认使用jdk动态代理。
cglib动态代理需要导入相应jar包,它是基于字节码的,是生成了代理真实类的子类,无论代理真实类有没有实现接口都可以使用。
spring的proxy-target-class属性可以配置动态代理的方式。设置为 true 使用 cglib;设置为 false 使用 jdk,但是要注意,如果需要代理的真实类没有实现接口,不能强制使用jdk动态代理。
Spring AOP 和 AspectJ的关系?
两者都是为了实现AOP这个目的而出现的技术,spring aop 参考 AspectJ编程风格。在springAOP的实现中,借用了AspectJ的一些功能,比如@AspceJ、@Before、@PonitCut这些注解,都是AspectJ中的注解。在使用springAOP的时候需要引入AspectJ的依赖。
AspcetJ作为AOP的一种实现,是基于编译的方式实现的AOP,在程序运行期是不会做任何事情的,因为类和切面是直接编译在一起的,使用的是编译期和类加载时进行织入。
Spring AOP是基于动态代理的实现AOP,意味着实现目标对象的切面会创建一个代理类,利用的是运行时织入,在Spring AOP中连接点是方法的执行。
能不能简单说下AOP中的切面、切点、连接点、通知,四者的关系?
通知
就是我们编写的希望Aop时额外执行的那个方法。我们通过Aop希望我们编写的方法在目标方法执行前执行,或者执行后执行。
切点
切点就是我们配置的满足我们条件的目标方法。比如我们规定:名字前面是select开头的才执行我们自定义的通知方法。那么这些select开头的方法就是切点。
连接点
连接点可以说是切点的全集。切点是连接点的子集。也可以理解为,连接点是我们没有定义那个select开头规则时,满足条件的全部方法。
spring允许你引用通知(Advice)的地方很多,基本每个方法的前、后以及前后都包括,或抛出异常时都可以是连接点,spring只支持方法连接点。
切面
切面是通知和切入点的结合。这里面没连接点什么事,连接点就是为了让你好理解切点搞出来的。通知说明了干什么和什么时候干(什么时候通过方法名中的befor,after,around等就能知道),切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
标签:jdk,连接点,spring,Spring,代理,切点,面试,AOP From: https://www.cnblogs.com/xfeiyun/p/17238688.html