AOP的概念
AOP(Aspect Oriented Programming),即面向切面编程。其主要作用是,在不修改源代码的情况下给某个或者一组操作添加额外的功能。像日志记录,事务处理,权限控制,异常处理等功能,都可以用AOP来实现,使这些额外的功能和真正的业务逻辑分离开来,让软件的结构将更加清晰。
AOP的实现
静态代理(Static Proxy)在编译代码的时候,将代码切入到指定的方法或者位置上去。
动态代理(Dynamic Proxy) 在程序运行时,运用反射机制动态创建而成,在运行时,动态的将代码切入到类的指定方法或者指定位置上的编程思想。
AOP的名词和作用
1.切面(Aspect)
切面编程的完整定义模块,切面是通知和切入点的结合。通知说明了什么时候该做如何做,而切入点说明了在哪个位置做,这就是一个完整的切面定义。
2.连接点(JoinPoint)
能够植入切面的部分,就是spring允许你使用通知的地方,比如方法前后,抛出异常时都可以是连接点,spring只支持方法连接点。
3.通知(Advice)
要对切面添加的功能代码,就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好,然后在想用的地方用一下。
而通知又有:
前置通知(Before advice):在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)。
后置通知(After returning advice):在某连接点正常完成后执行的通知。
异常通知(After throwing advice):在方法抛出异常退出时执行的通知。
最终通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
环绕通知(Around Advice):包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。
4.切入点(Pointcut)
针对哪些连接点植入通知,也就是指定具体的拦截地点。在一个类里,有多个方法,那就有多个连接点,但是你并不想在所有方法附近都使用通知,你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
5.引入(introduction)
对目标类添加新方法及属性,允许我们向现有的类添加新方法属性。就是把切面(也就是新方法属性:通知定义的)用到目标类中。
6.目标对象(Target object)
被切面切的对象,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被织入切面。而自己专注于业务本身的逻辑。
7.代理proxy
怎么实现整套aop机制的,都是通过代理。
8.织入(weaving)
把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时。
常用场景
常用于日志记录,性能统计,安全控制,事务处理,异常处理等等。
实现原理
AOP可以在编译时候将代码织入到指定的方法或者属性上,或者在运行的时候动态的将代码切入到指定的方法或者属性中。