Spring核心之AOP

本文详细介绍了Spring AOP的概念、术语、编程式和声明式AOP的实现,以及切面、自动代理和Spring与AspectJ的结合使用。通过案例展示了如何在业务代码中使用AOP进行日志记录、权限控制等增强操作,帮助读者理解AOP如何解决代码耦合问题,提升代码的可维护性。
摘要由CSDN通过智能技术生成

Spring-AOP 代理,增强
目标类 + 额外功能 = 代理类
比如:日志处理/事务处理/异常处理/性能分析…Redis 非关系型数据

  1. 通过spring AOP的代理功能,给代码增加额外的通用功能
  2. 业务逻辑就专心的处理实际需求,通用的增强功能独立出来
  3. 代理的专业术语
    额外功能叫 增强
    目标类叫 切入点 或 切面
    将增强 加入到 切入点,叫编织
    AOP是面向切面编程的一种实现

Spring AOP 知识点思维导图

在这里插入图片描述

什么是AOP?

AOP(Aspect-oriented Programming) , 名字与OOP(Object-oriented programming) 仅差一个字母, 其实它是对OOP编程的一种补充. AOP翻译过来叫面向切面编程, 核心就是这个切面. 切面表示从业务逻辑中分离出来的横切逻辑, 比如性能监控, 日志记录, 权限控制等, 这些功能都可以从核心业务逻辑代码中抽离出来. 也就是说, 通过AOP可以解决代码耦合问题, 让职责更加单一.

我们来通过代码来理解下概念, 这里有一个转账业务:

public interface IAccountService {
    //主业务逻辑: 转账
    void transfer();
}
public class AccountServiceImpl implements IAccountService {
    @Override
    public void transfer() {
        System.out.println("调用dao层,完成转账主业务.");
    }
}

现在有一个需求是, 在转账之前需要验证用户身份, 一般情况下我们直接就去修改源代码了:

public class AccountServiceImpl implements IAccountService {
    @Override
    public void transfer() {
	  System.out.println("对转账人身份进行验证.");
    System.out.println("调用dao层,完成转账主业务.");
}

}

但作为一个"有经验"的Java开发, 我们知道 “身份验证” 这个业务完全是可以剥离出来的, 所以使用下代理设计模式的思想:

public class AccountProxy implements IAccountService {
    //目标对象
    private IAccountService target;
public AccountProxy(IAccountService target) {
    this.target = target;
}

/**
 * 代理方法,实现对目标方法的功能增强
 */
@Override
public void transfer() {
    before();
    target.transfer();
}

/**
 * 身份验证
 */
private void before() {
    System.out.println("对转账人身份进行验证.");
}

}

public class Client {
public static void main(String[] args) {
//创建目标对象
IAccountService target = new AccountServiceImpl();
//创建代理对象
AccountProxy proxy = new AccountProxy(target);
proxy.transfer();
}
}

AOP的实现原理就是代理设计模式, 上面这个是静态代理, 但Spring AOP是通过动态代理实现的, 所以我们需要了解下动态代理: https://blog.csdn.net/litianxiang_kaola/article/details/85335700

AOP并不是由Spring独创, 在Spring之前就有了AOP开源框架—AspectJ, 而且AspectJ的AOP功能要比Spring更强大, 所以在Spring的后期版本中就集成了AspectJ. 但我们还是有必要了解下 Spring的AOP功能.

AOP术语

  • Targe
    目标对象
  • Joinpoint
    连接点, 所有可能被增强的方法都是连接点.
  • Pointcut
    切入点, 将被增强的方法.
  • Advice
    增强, 从主业务逻辑中剥离出来的横切逻辑.
  • Aspect
    切面, 切入点加上增强就是切面.
  • Weaving
    织入, 把切面应用到目标对象上的过程.
  • Proxy
    代理对象, 被增强过的目标对象.

Advice常见类型

  • 前置增强
    org.springframework.aop.MethodBeforeAdvice, 在目标方法执行前实施增强.
  • 后置增强
    org.springframework.aop.AfterReturningAdvice, 在目标方法执行后实施增强.
  • 环绕增强
    org.aopalliance.intercept.MethodInterceptor, 在目标方法执行前后都实施增强.
  • 异常抛出增强
    org.springframework.aop.ThrowsAdvice, 在方法抛出异常后实施增强.
  • 引入增强
    org.springframework.aop.IntroductionInterceptor, 对类进行增强, 即在目标类中添加一些新的方法和属性.

Spring AOP 之编程式

我们用编程式来感受下Spring AOP. 下面例子使用的是环绕增强.

(1) 业务类

public interface IAccountService {
    //主业务逻辑: 转账
    void transfer();
}
public class AccountServiceImpl implements IAccountService {
    @Override
    public void transfer() {
        System.out.println("调用dao层,完成转账主业务.");
    }
}

(2) 增强

public class AccountAdvice implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        before();
        Object result = invocation.proceed();
        after();
        return result;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring框架中的AOP(Aspect Oriented Programming,面向切面编程)是一个强大的特性,它允许开发者将跨越业务逻辑的行为,如事务管理、日志记录、安全检查等,抽取出来作为独立的模块(切面),并将其应用到多个目标对象(即被通知者)上,而无需修改原有代码。Spring AOP基于Java的动态代理机制,主要包含以下几个核心组件: 1. **切面(Aspect)**:AOP核心概念,它是业务逻辑和横切关注点的结合。切面由一组通知(advice)组成,通知可以是前置通知(Before)、后置通知(After)、环绕通知(Around)或抛出通知(Throwing)。 2. **通知(Advice)**:是切面中执行的实际代码块,用于执行特定的行为,比如方法调用前的验证、执行操作后的清理等。Spring提供了多种型的通知,如`@Before`、`@AfterReturning`、`@AfterThrowing`等。 3. **连接点(Join Point)**:是AOP中的一个重要概念,表示程序执行过程中的一个特定点,如方法调用、构造函数执行等。 4. **切入点(Pointcut)**:定义了一个或者一组通知何时何时何地应该执行,它是通知执行的条件。Spring的切入点表达式语法允许灵活匹配各种连接点。 5. **代理(Proxy)**:Spring使用动态代理技术创建目标对象的代理,代理对象在执行实际业务方法之前会调用通知代码,实现切面功能。 6. **@Aspect注解**:用于标记一个为切面,这个包含一个或多个通知方法。 7. **@AspectJ注解**:除了基于XML配置外,Spring还支持使用AspectJ语言编写切面,提供更丰富的语法和更多的元编程能力。 相关问题: 1. Spring AOP如何与Spring IoC容器集成? 2. 如何在Spring中声明一个切面和通知? 3. 在什么情况下我们会使用Spring的AspectJ而不是基于XML的配置方式?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值