编辑这个页面须要登录或更高权限!
该应用程序通常是多层开发的。典型的Java应用程序具有以下几层:
Web层: 它使用REST或Web应用程序公开服务。 业务层: 它实现了应用程序的业务逻辑。 数据层: 它实现了应用程序的持久性逻辑。
每层的职责不同,但是有一些适用于所有层的常见方面是 日志记录,安全性,验证,缓存等。这些常见方面被称为 跨领域关注点。
如果我们分别在每一层中实现这些关注点,则代码将变得更加难以维护。为了克服这个问题, 面向方面的编程(AOP)提供了一种解决跨领域问题的解决方案。
将跨领域关注作为一个方面。 定义切入点以指示必须在何处应用方面。
它确保跨领域关注点在一个内聚的代码组件中定义。
AOP (Aspect-Oriented Programming)是一种通过允许 跨领域关注点分离来提高模块化的编程模式。这些跨部门关注点与主要业务逻辑不同。我们可以在不修改代码本身的情况下向现有代码添加其他行为。
Spring的AOP框架可帮助我们实现这些跨领域的关注。
使用AOP,我们在一个地方。我们可以自由定义应用此功能的方式和位置,而无需修改应用新功能的类。现在,可以将横切关注点模块化为特殊类,称为 方面。
方面有 两个的优点:
首先,每个关注点的逻辑现在都集中在一个地方,而不是分散在整个代码库中。 其次,业务模块仅包含主要关注的代码。次要关注点已移至方面。
各个方面都有要执行的职责,称为 Advice。我们可以在一个或多个连接点将方面的功能实现到程序中。
它是用纯Java实现的。 不需要特殊的编译过程。 它仅支持方法执行连接点。 仅提供运行时编织。 有两种类型的AOP代理: JDK动态代理和 CGLIB代理。
跨领域关注点是我们要在应用程序中的多个位置实现的关注点。它会影响整个应用程序。
Aspect: 方面是一个模块,其中封装了advice和pointcuts,并提供cross-cutting可以有许多方面。我们可以使用带有 @Aspect 批注的常规类来实现方面。 Pointcut: 切入点是一种表达式,它选择一个或多个执行Advice的连接点。我们可以使用expressions或patterns定义切入点。它使用与联接点匹配的不同类型的表达式。在Spring Framework中,使用 AspectJ 切入点表达语言。 Join point: 连接点是应用程序中应用 AOP方面的点。或者它是Advice的特定执行实例。在AOP中,连接点可以是方法执行,异常处理,更改对象变量值等。 Advice: Advice是我们在方法执行之前before或after采取的措施。该动作是在程序执行期间调用的一段代码。SpringAOP框架中有五种类型的Advice: 在Advicebefore, after, after-returning, after-throwing和around advice。 是针对特定join point的Advice。 我们将在本节中进一步讨论这些Advice。 Target object: 一个应用了Advice的对象称为target object。目标对象始终是proxied,这意味着在运行时将创建一个覆盖目标方法的子类,并根据其配置包含Advice。 Weaving: 这是将各个方面与其他应用程序类型进行linking aspects的过程。我们可以在运行时,加载时间和编译时进行织造。
Proxy: 它是在将Advice应用于目标对象后创建的对象,称为 proxy 。 Spring AOP实现了 JDK动态代理,以使用目标类和Advice调用创建代理类。这些称为AOP代理类。
AOP与OOP之间的区别如下:
AOP | OOP |
Aspect: 一个封装切入点,Advice和属性的代码单元。 | Class: 一个封装方法和属性的代码单元。 |
Pointcut: 它定义了执行Advice的一组入口点。 | Method signature: 。它定义了执行方法主体的入口点。 |
Advice: 这是跨领域关注点的实现。 | Method bodies: 是业务逻辑问题的实现。 |
Waver: 借助Advice构造代码(源或对象)。 | Compiler: 它将源代码转换为目标代码。 |
AOP和OOP之间的区别如下:
Spring AOP | AspectJ |
需要单独的编译过程。 | 它需要AspectJ编译器。 |
它仅支持方法执行切入点。 | 它支持所有切入点。 |
它可以在Spring Container管理的bean上实现。 | 它可以在所有域对象上实现。 |
它仅支持方法级编织。 | 它可以波动字段,方法,构造函数,静态初始化器,最终类等。 |
AOP Advice有五种类型,如下所示:
Before Advice After Advice Around Advice After Throwing After Returning
Before Advice: 在连接点之前执行的Advice在通知之前被调用。我们使用 @Before 批注将Advice标记为Before通知。
After Advice: 在连接点之后执行的Advice被称为after notification。我们使用 @After 注解将Advice标记为After通知。
Around Advice: 在连接点之前和之后执行的Advice是
After Throwing: 在连接点抛出异常时执行的Advice。
After Returning: 当方法成功执行时执行的Advice。
在应用程序中实现AOP之前,我们需要在pom.xml文件中添加 Spring AOP 依赖项。
Spring Boot Starter AOP是提供Spring AOP和AspectJ的依赖项。 AOP提供基本的AOP功能,而AspectJ提供完整的AOP框架。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.2.2.RELEASE</version> </dependency>
在下一节中,我们将在应用程序中实现不同的Advice。