Spring中的Aop的理解

自作多情 提交于 2020-01-17 05:20:24

也是闲来无事,所有从头再把Spring 实战通读一下。

1.介绍面向切面编程的原理。

2.通过POJO创建切面。

3.使用注解@AspectJ。 

4为切面注入依赖。

下面主要围绕上面这四点开始介绍

首先,切面能帮助我们做什么? 专业一点就是可以帮助我们模块化横切关注点。【横切关注点】描述为影响应用多处的功能。(安全,事务,其他,等)

划分多个模块,每个模块的核心都需要为特定的业务领域提供服务,但是这些模块也都需要类似的辅助功能。

想要重用这些功能的话,常见的就是面向对象的继承(inheritance)和委托(delegation)。

       切面提供了取代继承和委托的另一种可选方案。

在使用面向切面编程时,我们还是在一个地方定义通用的功能,但是可以通过声明的方式定义这个功能要以何种方式在何处应用。

而无需修改受影响的类。横切关注点可以模块化为一个特殊的类,这些类又被称为 切面(aspect)

这样做的好处就是,现在的每个关注点都集中在了一个地方。而不是分散到多处代码中。降低了耦合,再者就是简洁,它们这些类只包含关注点的代码,二次要的关注点代码被转移到了切面中。]

Aop 相关术语

 

通知(Advice)定义了切面是什么以及什么时候使用。

  前置通知(Before):在目标方法被调用之前调用通知功能

  后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

  返回通知(After-returning):在目标方法成功执行之后调用通知;

  异常通知(After-throwing):在目标方法抛出异常后调用通知;

  环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

连接点(Join point)   

  我们的应用可能也有数以千计的时机应用通知。这些时机被称为连接点。连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。

 

切点(Poincut)    

  一个切面并不需要通知应用的所有连接点。切点有助于缩小切面所通知的连接点的范围。

切面(Aspect)

  切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和何处完成其功能。

引入(Introduction)

  引入允许我们向现有的类添加新方法或属性。(可以被引入到现有的类中,从而可以在无需修改这些现有的类的情况下,让它们具有新的行为和状态)

织入(Weaving)  

  织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:   

  编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。

  类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ 5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面。

  运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的。

  通知包含了需要用于多个应用对象的横切行为;连接点是程序执行过程中能够应用通知的所有点;切点定义了通知被应用的具体位置(在哪些连接点)。其中关键的概念是切点定义了哪些连接点会得到通知。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!