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编译,并添加一个方面编织阶段到您的构建脚本。

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

目录
相关文章
|
10月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
867 0
|
11月前
|
Java API 开发者
Spring 控制反转与依赖注入:从玄学编程到科学管理
在传统开发中,手动`new`对象导致紧耦合、难以维护和测试。控制反转(IoC)将对象创建交给框架,实现解耦。Spring通过IOC容器自动管理对象生命周期,开发者只需声明依赖,无需关心创建细节。依赖注入(DI)是IoC的具体实现方式,支持构造器、Setter和字段注入。构造器注入推荐使用,保证依赖不可变且易于测试。对于多个同类型Bean,可用`@Qualifier`或`@Primary`解决冲突。此外,Spring还支持依赖查找(DL),开发者主动从容器获取Bean,适用于动态场景,但侵入性强。掌握IoC与DI,有助于构建灵活、可维护的Spring应用。
|
9月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
11月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
11月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
1439 0
|
9月前
|
监控 Java Spring
AOP 切面编程
AOP(面向切面编程)通过动态代理在不修改源码的前提下,对方法进行增强。核心概念包括连接点、通知、切入点、切面和目标对象。常用于日志记录、权限校验、性能监控等场景,结合Spring AOP与@Aspect、@Pointcut等注解,实现灵活的横切逻辑管理。
2209 6
AOP 切面编程
|
11月前
|
监控 Java Spring
AOP切面编程快速入门
AOP(面向切面编程)通过分离共性逻辑,简化代码、减少冗余。它通过切点匹配目标方法,在不修改原方法的前提下实现功能增强,如日志记录、性能监控等。核心概念包括:连接点、通知、切入点、切面和目标对象。Spring AOP支持多种通知类型,如前置、后置、环绕、返回后、异常通知,灵活控制方法执行流程。通过@Pointcut可复用切点表达式,提升维护性。此外,结合自定义注解,可实现更清晰的切面控制。
798 5
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
389 2
|
人工智能 监控 Java
面向切面编程(AOP)介绍--这是我见过最易理解的文章
这是我见过的最容易理解的文章,由浅入深介绍AOP面向切面编程,用科普版和专家版分别解说,有概念,有代码,有总结。