SpringFramework核心技术五:面向切面编程(AOP)和Spring

简介: 面向对象和面向切面两种编程方式的比较面向方面编程(AOP)通过提供关于程序结构的另一种思考方式来补充面向对象编程(OOP)。

面向对象和面向切面两种编程方式的比较

面向方面编程(AOP)通过提供关于程序结构的另一种思考方式来补充面向对象编程(OOP)。OOP中模块化的关键单元是类,而在AOP中,模块化的单元是方面。方面可以实现关注的模块化,例如跨越多种类型和对象的事务管理。(这种担忧在AOP文献中常常被称为横切关注点。)

AOP的介绍

1.基本的介绍

AOP框架是Spring的关键组件之一。虽然Spring IoC容器不依赖AOP,也就是说如果你不想使用AOP那么就不用AOP,AOP可以为Spring IoC提供功能非常强大的中间件解决方案。

Spring 2.0+ AOP

Spring 2.0引入了一种使用基于模式的方法或@AspectJ注释样式编写自定义方面的更简单,更强大的方法。这两种风格都提供完全类型化的建议和AspectJ切入点语言的使用,同时仍然使用Spring AOP进行编织。
本章将讨论基于Spring 2.0+模式和@AspectJ的AOP支持。下一章将讨论较低级别的AOP支持,如Spring 1.2应用程序中常见的那样。

AOP在Spring框架中用于……

  • …提供声明式企业服务,特别是作为EJB声明式服务的替代品。最重要的这种服务是 声明式事务管理。
  • …允许用户实现自定义方面,补充他们与AOP一起使用OOP。

2.AOP概念

AOP的概念

3.Spring框架的核心

Spring框架的核心原则之一是非侵入性 ; 这是因为您不应该被迫在您的业务/域模型中引入特定于框架的类和接口。但是,在某些地方,Spring Framework确实为您提供了将Spring Framework特定的依赖项引入代码库的选项:为您提供此类选项的基本原理是因为在某些情况下,它可能更容易阅读或编写某些特定的部分功能以这种方式。Spring Framework(几乎)总是为您提供选择:您可以自由决定哪种选项最适合您的特定用例或场景。

与本章相关的一个选择是选择哪种AOP框架(以及哪种AOP样式)。您可以选择AspectJ和/或Spring AOP,并且您还可以选择@AspectJ批注样式方法或Spring XML配置样式方法。本章选择首先引入@AspectJ风格方法的事实不应视为Spring团队赞成Spring XML配置风格的@AspectJ注释风格方法。

4.AOP代理

Spring AOP默认使用AOP代理的标准JDK 动态代理。这使得任何接口(或接口集)都可以被代理。
Spring AOP也可以使用CGLIB代理。这是代理类而不是接口所必需的。如果业务对象不实现接口,则缺省使用CGLIB。因为优良的做法是编程接口而不是类; 业务类通常会实现一个或多个业务接口。在需要通知未在接口中声明的方法的情况下,或者需要将代理对象作为具体类型传递给方法的情况下(希望很少),可以 强制使用CGLIB。
掌握Spring AOP是基于代理的事实是很重要的。请参阅 了解AOP代理以彻底检查此实现细节的实际含义。

二、@AspectJ支持

5.2。@AspectJ支持
@AspectJ引用了一种将方面声明为常规Java类的注释类型。AspectJ项目引入了@AspectJ风格, 作为AspectJ 5版本的一部分。Spring使用AspectJ提供的用于切入点解析和匹配的库来解释与AspectJ 5相同的注释。AOP运行时仍然是纯粹的Spring AOP,并且不依赖于AspectJ编译器或编织器。

1.启用@AspectJ支持

要在Spring配置需要启用配置基于@AspectJ方面的Spring AOP和Spring支持使用@AspectJ切面,自动代理基于它们是否被那些方面建议豆。通过autoproxying我们的意思是,如果Spring确定一个或多个方面的bean被建议,它会自动生成该bean的代理来拦截方法调用并确保根据需要执行通知。
可以使用XML或Java风格配置启用@AspectJ支持。无论哪种情况,您还需要确保AspectJ的aspectjweaver.jar库位于应用程序的类路径中(版本1.8或更高版本)。该库可在’lib’AspectJ发行版的 目录中或通过Maven Central存储库获得。

2.启用@AspectJ支持

要使用Java启用@AspectJ支持,请@Configuration添加@EnableAspectJAutoProxy 注释:

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {

}

使用XML配置启用@AspectJ支持
要使用基于XML的配置启用@AspectJ支持,请使用以下aop:aspectj-autoproxy 元素:

<aop:aspectj-autoproxy/>

3.Declaring(宣布) an aspect(切面)

启用@AspectJ支持后,任何在应用程序上下文中定义的,具有@AspectJ方面(具有@Aspect注解)的类的bean 都将被Spring自动检测并用于配置Spring AOP。以下示例显示了一个不太有用的方面所需的最小定义:
应用程序上下文中的常规bean定义,指向具有@Aspect注释的bean类:

<bean id="myAspect" class="org.xyz.NotVeryUsefulAspect">
    <!-- configure properties of aspect here as normal -->
</bean>

而NotVeryUsefulAspect类的定义,与注解 org.aspectj.lang.annotation.Aspect注释;

package org.xyz;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class NotVeryUsefulAspect {

}

方面(带有注释的类@Aspect)可能具有与任何其他类一样的方法和字段。它们也可能包含切入点,建议和介绍(类型间)声明。

通过组件扫描自动检测方面
您可以在Spring XML配置中将方面类注册为常规bean,或者通过类路径扫描自动检测它们 - 就像任何其他Spring管理的bean一样。但是,请注意,@Aspect注解是不足够的classpath中自动检测:为了这个目的,你需要添加一个单独的@Component注释(或可选择地有资格,按照Spring的组件扫描仪的规则自定义构造型注解)。
与其他方面的方面建议?
在Spring AOP,它是不是可以有自己的方面从其他方面意见的目标。类上的@Aspect注释将其标记为方面,因此将其从自动代理中排除。

4.Declaring a pointcut(切入点)

回想一下,切入点确定了感兴趣的连接点,从而使我们能够控制建议何时执行。Spring AOP仅支持Spring bean的方法执行连接点,因此您可以将切入点视为匹配Spring Bean上方法的执行。切入点声明包含两部分:包含名称和任何参数的签名以及确切地确定我们感兴趣的方法执行的切入点表达式。在AOP的@AspectJ注释样式中,切入点签名由常规方法提供定义,并且使用@Pointcut注释来指示切入点表达式(用作切入点签名的方法 必须具有void返回类型)。
一个例子将帮助区分切入点签名和切入点表达式之间的区别。以下示例定义了一个名为的切入点’anyOldTransfer’,它将匹配任何名为的方法的执行’transfer’:

@Pointcut("execution(* transfer(..))")// the pointcut expression
private void anyOldTransfer() {}// the pointcut signature

……

三、Spring AOP还是完整的AspectJ?

使用最简单的方法。Spring AOP比使用完整的AspectJ更简单,因为不需要将AspectJ编译器/编织器引入到开发和构建过程中。如果您只需要建议Spring bean执行操作,那么Spring AOP就是正确的选择。如果您需要建议不是由Spring容器管理的对象(通常是域对象),那么您将需要使用AspectJ。如果您希望建议除简单方法执行之外的连接点(例如,字段获取或设置连接点等),则还需要使用AspectJ。

使用AspectJ时,您可以选择AspectJ语言语法(也称为“代码样式”)或@AspectJ注释样式。很显然,如果你不使用Java 5+,那么你已经选择了…使用代码风格。如果方面在您的设计中扮演重要角色,并且您可以使用针对Eclipse 的AspectJ开发工具(AJDT)插件,那么AspectJ语言语法是首选选项:它更干净更简单,因为语言是专门为写方面。如果您没有使用Eclipse,或者只有少数几个方面在应用程序中不起主要作用,那么您可能需要考虑使用@AspectJ风格,并在IDE中使用常规的Java编译,并添加一个方面编织阶段到您的构建脚本。

这个面向切面编程讲的较为抽象!
具体的下一次咱们在研究下!

目录
相关文章
|
2月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
62 1
|
16天前
|
安全 Java 编译器
什么是AOP面向切面编程?怎么简单理解?
本文介绍了面向切面编程(AOP)的基本概念和原理,解释了如何通过分离横切关注点(如日志、事务管理等)来增强代码的模块化和可维护性。AOP的核心概念包括切面、连接点、切入点、通知和织入。文章还提供了一个使用Spring AOP的简单示例,展示了如何定义和应用切面。
51 1
什么是AOP面向切面编程?怎么简单理解?
|
21天前
|
XML Java 开发者
论面向方面的编程技术及其应用(AOP)
【11月更文挑战第2天】随着软件系统的规模和复杂度不断增加,传统的面向过程编程和面向对象编程(OOP)在应对横切关注点(如日志记录、事务管理、安全性检查等)时显得力不从心。面向方面的编程(Aspect-Oriented Programming,简称AOP)作为一种新的编程范式,通过将横切关注点与业务逻辑分离,提高了代码的可维护性、可重用性和可读性。本文首先概述了AOP的基本概念和技术原理,然后结合一个实际项目,详细阐述了在项目实践中使用AOP技术开发的具体步骤,最后分析了使用AOP的原因、开发过程中存在的问题及所使用的技术带来的实际应用效果。
48 5
|
1月前
|
存储 Java API
简单两步,Spring Boot 写死的定时任务也能动态设置:技术干货分享
【10月更文挑战第4天】在Spring Boot开发中,定时任务通常通过@Scheduled注解来实现,这种方式简单直接,但存在一个显著的限制:任务的执行时间或频率在编译时就已经确定,无法在运行时动态调整。然而,在实际工作中,我们往往需要根据业务需求或外部条件的变化来动态调整定时任务的执行计划。本文将分享一个简单两步的解决方案,让你的Spring Boot应用中的定时任务也能动态设置,从而满足更灵活的业务需求。
84 4
|
2月前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
39 1
|
1月前
|
Java 容器
AOP面向切面编程
AOP面向切面编程
42 0
|
2月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
【9月更文挑战第9天】AOP(面向切面编程)通过分离横切关注点提高模块化程度,如日志记录、事务管理等。Micronaut AOP基于动态代理机制,在应用启动时为带有特定注解的类生成代理对象,实现在运行时拦截方法调用并执行额外逻辑。通过简单示例展示了如何在不修改 `CalculatorService` 类的情况下记录 `add` 方法的参数和结果,仅需添加 `@Loggable` 注解即可。这不仅提高了代码的可维护性和可扩展性,还降低了引入新错误的风险。
47 13
|
5月前
|
前端开发 Java 数据库
浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
|
3月前
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
|
3月前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
53 0