通知、增强(Advice)
通知就是你想要的功能,在特定的连接点,AOP框架执行的动作。
Spring切面可以应用5种类型的通知:
前置通知(Before):在目标方法被调用之前调用通知功能;
后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
返回通知(After-returning):在目标方法成功执行之后调用通知;
异常通知(After-throwing):在目标方法抛出异常后调用通知;
环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
连接点(JoinPoint)
程序执行过程中明确的点,如方法调用前,方法调用后,方法返回,方法抛出异常等。一个类或一段程序代码拥有一些具有边界性质的特定点,这些点中的特定点就称为“连接点”。Spring仅支持方法的连接点。允许使用通知的地方,都算连接点。
切点(PointCut)
相当于特定的连接点(JoinPoint),AOP通过“切点”定位特定的连接点。连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。
上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,下面说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
切面(Aspect)
通知和切入点共同组成了切面。说到这里,其实发现连接点的概念就是给你理解切点用的。通知说明了干什么和什么时候干,而切点说明了在哪儿干,两个加起来,何时、何处、做什么。
在spring里可以利用xml
或者[@Aspect](https://my.oschina.net/aspect)
注解定义切面
从下面的xml
定义就可以看到切面是咋回事了,包含了pointcut
和adivce
(before
)。
<aop:aspect id="aspectDemo" ref="aspectBean">
<aop:pointcut id="myPointcut" expression="execution(* package1.Foo.handle*(..)"/>
<aop:before pointcut-ref="myPointcut" method="doLog" />
</aop:aspect>
引入(Introduction)
引入是指给一个现有类添加方法或字段属性,引入还可以在不改变现有类代码的情况下,让现有的Java类实现新的接口(以及一个对应的实现)。相对于Advice可以动态改变程序的功能或流程来说,引介(Introduction)则用来改变一个类的静态结构。
Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified
接口,来简化缓存。Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor
来实现通知,通过DefaultIntroductionAdvisor
来配置Advice和代理类要实现的接口
(引入允许我们向业务类中业务方法添加新的方法和属性【spring提供了一个方法注入的功能】)
目标(Target)
引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。
代理(Proxy)
应用通知的对象,详细内容参见设计模式里面的代理模式
(换句话:就是代理做了切面的业务,也做了真正的业务。)
AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
Spring缺省使用J2SE 动态代理(dynamic proxies)来作为AOP的代理。这样任何接口都可以被代理。
Spring也支持使用CGLIB代理. 对于需要代理类而不是代理接口的时候CGLIB代理是很有必要的。 如果一个业务对象并没有实现一个接口,默认就会使用CGLIB。 作为面向接口编程的最佳实践,业务对象通常都会实现一个或多个接口。
织入(Weaving)
把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:
- 编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ的织入编译器
- 类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码
- 运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术
织入是将通知添加对目标类具体连接点上的过程。AOP像一台织布机,将目标类、通知或引介通过AOP这台织布机天衣无缝地编织到一起。
把切面应用到目标对象来创建新的代理对象的过程,Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。
参考
感谢各位巨人。
AOP的主要概念和术语
Spring - AOP简单理解及术语解释
Spring AOP术语
Spring AOP概念术语的通俗理解
我对aop的通俗理解