1. AOP框架具有的两个特征:
各个步骤之间良好的隔离性;
源代码无关性。
2. 在SpringAOP中关注点和横切点有什么不同?
关注点是我们想在应用的模块中实现的行为,比如在所有电子商务应用中,关注点可能是库存管理,用户管理等。
横切点是贯穿整个应用程序的关注点。像日志,数据转换等,在一个应用程序中是必须的。
3. 连接点和切入点是什么?
连接点是程序执行的一个点。例如一个方法的执行或者一个异常的处理。在SpringAOP中一个连接点总是代表一个方法的执行。
切入点是一个匹配连接点的表达式。Advice与切入点相关联,并在切入点匹配的连接点处运行。Spring默认使用Aspect J切入点表达式。
4.Spring中有哪些不同的通知类型?
通知是在程序中想要应用在其他模块中的横切关注点。
前置通知:在连接点之前执行的advice,除非抛出异常,否则不可以中断执行流。调用@Before使用。
后置通知:无论连接点是以什么样的方式退出的都会执行的advice。调用@After使用。
围绕通知:围绕连接点执行的advice。调用@Around使用。
返回之后通知:在连接点正常结束后返回的advice。调用@AfterReturn使用
抛出异常之后通知:在方法抛出异常退出后执行的advice。调用@AfterThrow使用。
5.什么是织入
织入是将切面与外部的应用类型或者类连接起来以创建通知对象的过程。Spring AOP只在运行时执行织入。SpringAOP框架 仅支持有限的几个Aspect J切入点的类型,它允许将切面运用到IOC容器中声明的bean上。如果想使用别的切入点类型或者将切面应用到IOC容器外部创建的类,那么就必须在Spring程序中使用AspectJ框架,并且使用它的织入特性。
Aspect J编译时织入是ajc特殊的Aspect J编译器完成的。它可以将切面织入到你的Java源码文件中,然后输出织入后的二进制class文件。它也可以将切面织入编译后的class文件或者jar文件,这个过程叫做后编译时织入。在SpringIOC容器中声明类之前,可以为它们运行编译时和后编译时织入,Spring完全没有被包含到织入的过程。
Aspect J加载时织入在目标类被类加载器加载到JVM时触发。对于一个被织入的对象,需要一个特殊的类加载器来增强目标类的字节码。AspectJ 和 Spring 都提供了加载时织入器以为类加载添加加载时织入的能力。只需要简单的配置就可以打开这个加载时织入器。
6.SpringAOP代理是什么?
AOP代理是一个由AOP框架创建用于在运行时实现切面协议的对象。
SpringAOP默认使用的是JDK的动态代理,这使得任何接口都可以被代理,SpringAOP也使用cglib代理,如果是代理类则必须使用这个代理,如果业务对象没有实现任何接口那么默认使用cglib。cglib代理实现了asm这个操纵字节码的框架,所以可以在不实现接口的情况下完成代理。