【Spring实战】面向切面的Spring 今天药忘吃喽~ 2023-07-24 14:55 2阅读 0赞 面向切面编程的基本原理 DI有助于应用对象之间的解耦,而AOP可以实现横切关注点与他们所影响对象之间的解耦。 ## 1.什么是面向切面编程 ## 切面能够帮助我们模块化横切关注点。横切关注点可以被描述为影响应用多处的功能。安全就是一个横切关注点 ### 定义AOP术语 ### **通知**:定义了切面是什么,以及何时使用,除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题,他应该用在某个方法被调用之前/之后/之前之后都调用,还是方法抛出异常时调用 ### **Spring切面可以应用5钟类型的通知** ### 1. 前置通知 2. 后置通知 3. 返回通知 4. 异常通知 5. 环绕通知 **连接点**——连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。 **切点**——一个切面并不需要通知应用的所有连接点。切点有助于缩小切面所通知的连接点的范围。 **通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”。** **切面**——是通知和切点的结合.通知和切面共同定义了切面的全部内容——它是什么,它在何时和何处完成其功能。 **引入**——允许我们向现有的类添加新的方法或属性;创建一个通知类该类记录了对象最后一次的修改状态,需要一个方法和一个实例变量来保存这个状态。然后这个新方法和新实例变量就可以引入到现有类中,从而无需修改这些现有类的情况下,让他们具有新的行为和状态。 **织入**——把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的声明周期里有多个点可以进行织入。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70][] **Spring提供了4种类型的AOP支持** 1. 基于代理的经典SpringAOP 2. 纯POJO切面 3. @AspectJ注解驱动的切面; 4. 注入式AspectJ切面(适用于Spring各版本) 前三种都是AOP实现的变体,SpringAOP构建在动态代理的基础之上,因此,Spring对AOP的支持局限于方法的拦截 ### **Spring在运行时通知对象** ### 通过在代理类中包裹对象,Spring在运行期间把切面织入到Spring管理的Bean中。代理类封装了目标类,并拦截被通知方法的调用,再把调用转发给真正的目标bean。当代理拦截到方法调用时,在调用目标Bean方法之前,会执行切面逻辑。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 1][] 直到应用需要被代理的bean时,Spring才创建代理对象。如果使用 的是ApplicationContext的话,在ApplicationContext从BeanFactory中加载所有bean的时候,Spring才会创建被代理的对象。因为Spring运行时才创建代理对象,所以我们不需要特殊的编译器来织入AOP的切面。 ### Spring只支持方法级别的连接点 ### 通过各种AOP方案可以支持多种连接点模型。因为Spring基于动态代理,所以Spring只支持方法连接点。 ## 通过切点来选择连接点 ## 在SpringAOP中,要是用AspectJ的切点表达式语言来定义切点。 **SpringAOP 所支持的AspectJ切点指示器** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 2][] 我们注意到只有execution指示器是实际执行匹配的,而其他的指示器都是用来显示匹配的。execution指示器是我们在编写切点定义时最主要使用的指示器。 **编写切点** **为了阐述Spring中的切面,我们需要有个主题来定义切面的切点。** ![20200412220829317.png][] **定义切点表达式** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 3][] ![20200412221148223.png][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 4][] ## 使用注解创建切面 ## ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 5][] AspectJ提供了无个注解来定义通知 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 6][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 7][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 8][] **如果你就此止步的话,Audience只会是Spring容器中的一个bean,即便使用了AspectJ注解它也不会被视为切面,这些注解不会解析,也不会创建其转换为切面的代理。** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 9][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 10][] ### 创建环绕通知 ### ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 11][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 12][] ### 处理通知中的参数 ### ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 13][] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70]: /images/20230528/198d9e8e6ab84cd8a977896cd12b6b79.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 1]: /images/20230528/f912d56b936f4eecaa7848e9622867f3.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 2]: /images/20230528/c0787c1403894fbca7f1052ad1e2467a.png [20200412220829317.png]: /images/20230528/44c9f0b40a3f436b9f9e394dfdc304bb.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 3]: /images/20230528/ed58959a88b245afb0d9bf4de24717a7.png [20200412221148223.png]: /images/20230528/f336efd535b34558a02910e6c8c226a2.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 4]: /images/20230528/9863aa97529242a8bb07f87662946fbf.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 5]: /images/20230528/5d80197275b044d99fa40bab1c9677f2.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 6]: /images/20230528/54c7fbf02efc4ca980992378a800b9dd.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 7]: /images/20230528/8fa3d02e5ef54b8898d2d21b0e1fdbc1.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 8]: /images/20230528/7f713067448a485fab18b8bb0f328e3e.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 9]: /images/20230528/cdda74dd96824ddc8349d2e3213973a0.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 10]: /images/20230528/77e932134bfe44cf9cf0385b5a456e43.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 11]: /images/20230528/8d2c6d46a95d4cf69712c53931682e47.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 12]: /images/20230528/a94e3fbd0b4b45448ef55dcc93366d44.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 13]: /images/20230528/19eea49ef2c449f5b67be6064bb35b26.png
还没有评论,来说两句吧...