spring之AOP(重点!!!!)
1.AOP定义
AOP:Aspect-Oriented Programming “面向切面编程”,通过预编译的方式和运行期间动态代理实现程序功能的统一维护的技术。AOP是OOP(面向对象编程)的延伸。
简单的说AOP的编程思想:把业务逻辑和横切的问题进行分离,从而达到解耦的目的,使代码的重用性和开发效率高(目的是重用代码,把公共的代码抽取出来)
2.AOP在spring中的作用?
作用:提供声明式事务,允许用户自定义切面。
3.springAOP中可以通过advice定义横切逻辑,spring中支持5种类型的advice
4.AOP的发展历程(了解即可)
4.1静态AOP(第一代)
以AspectJ为代表,特点:相应的横切关注点以Aspect形式实现后,会通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中。
优点:Aspect直接以java字节码的形式编译到java类中,java虚拟机可以像通常加载java类运行,不会对整个系统运行造成任何性能损失。
缺点:灵活性不够。
4.2动态AOP(第二代)
通过java语言提供的各种动态特性来实现Aspect织入当前系统的过程。spring AOP就是第二代的AOP!!!
5.AOP的公民(了解即可)
Joinpoint:拦截点,如某个业务方法。
Pointcut:Joinpoint的表达式,表示拦截哪些方法。一个Pointcut对应多个Joinpoint。
Advice: 要切入的逻辑。
Before Advice 在方法前切入。
After Advice 在方法后切入,抛出异常时也会切入。
After Returning Advice 在方法返回后切入,抛出异常则不会切入。
After Throwing Advice 在方法抛出异常时切入。
Around Advice 在方法执行前后切入,可以中断或忽略原有流程的执行。
6.spring AOP 的实现机制
spring AOP通过动态代理机制和字节码生成技术实现。
6.1动态代理机制
动态代理的核心:代理对象的生成
实现:主要由一个类、一个接口组成。即java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
7.springAOP有哪些不同的通知类型?
前置通知(Before advice):在连接点之前执行的Advice,不过除非它抛出异常,否则没有能力中断执行流。使用 @Before 注解使用这个Advice。
后置通知(After advice) 无论连接点是通过什么方式退出的(正常返回或者抛出异常)都会执行在结束后执行这些Advice。通过 @After 注解使用.
围绕通知(Around advice) 围绕连接点执行的Advice,就你一个方法调用。这是最强大的Advice。通过 @Around 注解使用。
返回之后通知(After Retuning advice) 在连接点正常结束之后执行的Advice。例如,如果一个方法没有抛出异常正常返回。通过 @AfterReturning 关注使用它。
抛出异常后通知(After Throwing advice) 如果一个方法通过抛出异常来退出的话,这个Advice就会被执行。通用 @AfterThrowing 注解来使用。
8.AOP的应用场景?
日志记录
权限验证
效率检测
事务管理(spring的事务就是用AOP实现的)
9.什么是织入(weaving)?
毛主席:“一桥飞架南北,天堑变通途”织入过程就是“飞架”。
将切面与外部的应用类型或者类连接起来以创建通知对象的过程就是织入
织入器:完成织入过程的那个“人”就是织入器(完成横切关注点逻辑到系统的最终织入)
例如:AspectJ的织入器是编译器ajc、JBoss的织入器是类加载器、spring AOP 的织入器是ProxyFactory类
10.引介(Introduction)是什么?
让一个切面可以声明被通知的对象实现了任何他们没有真正实现的额外接口,而且为这些对象提供接口的实现
使用 @DeclareParaents 注解来生成一个引介。
11.什么是连接点(Joint Point)和切入点(Point cut)?
(1)连接点:程序执行的一个点。(比如:一个方法的执行或者一个异常的处理)spring AOP中,一个连接点总是代表一个方法执行。
(2)切入点:匹配连接点的断言或表达式。Spring 默认使用 AspectJ 切入点表达式语言。