【Spring】AOP

本文介绍了Spring AOP的基本概念,包括面向切面编程(AOP)、连接点、切入点、通知和切面等关键术语,并概述了如何在Spring框架中使用AspectJ进行AOP操作。

一、基本概念:

1、aop Aspect Oriented Programing:面向切面(方面)编程:扩展功能不需要修改源代码(Struts2的拦截器涉及到了)

2、AOP采取 横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)


比如现在需要添加日志,最原始做法是直接修改源代码。后来演变成纵向抽取机制,但这种方法也存在问题,比如父类的方法名发生改变,子类的方法名也需随之而变。

3、Spring AOP采用纯java实现,不需要专门的 编译过程 和 类加载器,在运行期通过代理方式(动态代理)向目标类织入增强代码

二、aop操作术语

public class User{
   public void add(){}
   public void update(){}
   public void delete(){}
   public void findAll(){}
}

1、连接点(Joinpoint):类里面哪些方法可以被增强,这些方法称为连接点
(User类的add、update、delete、findAll方法都是连接点)
2、切入点(Pointcut):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。
(在类里面可以有很多的方法被增强,比如实际操作中,只是增强了Add方法和update方法,实际增强的方法称为切入点)
3、增强/通知(Advice):所谓通知是指拦截到Joinpoint之后所要做的时候就是通知(通知分为前置通知,后置通知,异常通知、最终通知、环绕通知)

前置通知:在方法之前执行

最常见的例子就是 数据校验啦。比如开始时间小于结束时间

(不要告诉我你已经在前端做验证啦,因为。。。)

后置通知:在方法之后执行

最常见的例子就是添加操作日志,也就是说谁在什么时候干什么事,如下图。


异常通知:方法出现异常
最终通知:在后置之后执行
环绕通知:在方法之前和之后执行(可以知道方法执行的时间)
4、切面(Aspect):是切入点和通知的结合,把增强应用到具体方法上面,过程称为切面

(把增强应用到切入点的过程)

三、Spring的aop操作

1、在spring里面进行aop操作,是要用aspectj实现

(1)aspectj不是spring的一部分,和spring一起使用进行aop操作

(2)Spring2.0以后新增了对AspectJ支持

2、使用aspectj实现aop有两种方式

(1)基于aspectj的xml配置

(2)基于aspectj的注释方式

3、Aop操作准备

(1)除了导入基本的jar包之外,还需要导入aop相关的jar包

(2)创建spring核心配置文件,导入aop约束


###Spring AOP 的概念 AOP(Aspect-Oriented Programming)即面向切面编程,是一种编程范式,旨在通过分离横切关注点来提高模块化程度。在 Spring 框架中,AOP 被广泛用于实现诸如日志记录、事务管理、安全性等通用功能,这些功能通常与业务逻辑无关但又需要在多个地方重复使用。 Spring AOP 主要是基于 AspectJ 实现的,尽管 AspectJ 是一个独立的 AOP 框架,并不是 Spring 的组成部分,但它通常与 Spring 一起使用以提供更强大的 AOP 功能[^1]。Spring AOP 支持两种方式来定义切面:基于 XML 配置文件的方式和基于注解的方式。 ###Spring AOP 的原理 Spring AOP 使用运行时代理来实现 AOP 功能,这意味着它会在运行时动态生成代理对象。对于实现了接口的类,Spring AOP 默认使用 JDK 动态代理;而对于没有实现接口的类,则会使用 CGLIB 代理[^4]。这种方式允许在不修改原始代码的情况下向程序中添加新的行为。 织入(Weaving)是将增强(advice)应用到目标对象的过程,Spring AOP 在运行时进行织入操作[^3]。当创建了代理对象后,所有对目标对象方法的调用都会被拦截,并且可以插入额外的操作,比如在方法执行前后做一些处理。 ###Spring AOP 的使用教程 要开始使用 Spring AOP,首先需要确保项目中包含了必要的依赖。如果使用 Maven 构建工具,可以在 `pom.xml` 文件中加入如下依赖: ```xml <!-- 引入aop依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 一旦添加了依赖并刷新了 Maven 项目,就可以开始编写切面了。下面是一个简单的例子,展示如何使用注解来定义一个切面: ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Method " + joinPoint.getSignature().getName() + " is called."); } } ``` 在这个示例中,`LoggingAspect` 类被标记为 `@Aspect` 和 `@Component` 注解,这样 Spring 就能识别这是一个切面组件。`@Before` 注解指定了在哪些方法上应用前置通知(before advice),这里的表达式表示匹配 `com.example.service` 包下所有的方法。 ###
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值