【Spring篇】详解AOP相关知识

🎊专栏【Spring】

🍔喜欢的诗句:天行健,君子以自强不息。

🎆音乐分享【如愿】

🎄欢迎并且感谢大家指出小吉的问题🥰

文章目录


AOP(面向切面编程)是Spring框架中的重要组成部分。它允许在不修改原代码的情况下为程序动态地添加新的功能。如果你也想提高Spring应用的可扩展性,本文将带你深入学习Spring AOP的核心概念。

我们将讲解AOP的作用、实现方式和关键组成部分,包括切面、通知、切入点等。并使用注解的方式实现一个简单的切面示例,让你快速了解AOP的基本用法。学完本文你将能够在Spring项目中应用AOP思想,解耦业务代码,轻松实现新的功能需求。让我们开始AOP之旅!

🌺AOP简介

AOP(Aspect-Oriented Programming)是面向切面编程的一种编程范式,指导开发者如何组织程序结构。它提供了一种将横切关注点(例如日志记录、性能统计、安全检查等)与业务逻辑分离的方法。

在传统的面向对象编程中,业务逻辑通常分散在多个对象或方法中。而使用AOP,我们可以通过定义切面(Aspect)来将这些横切关注点集中起来,并将其应用到多个对象或方法上。

切面是一个跨越多个类和方法的模块化单元,它定义了横切关注点和相应的行为。在程序运行时,AOP框架会根据切面的定义,动态地将其织入到目标对象或方法中,从而实现横切关注点的功能增强。

🌺AOP作用

在不影响原始设计的基础上进行功能增强

原代码不用改,功能就变强了

🌺AOP核心概念

切面描述的是 通知的共性功能 与 对应的 切入点 的关系,在 哪个切入点 上 执行哪些通知

🎄AOP入门案例

项目结构

在pom.xml文件中导入依赖

xml 复制代码
<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.3</version>
    </dependency>
  </dependencies>

🛸报错解决

这里可能会报错

🏳️‍🌈方法一

切换版本号

🏳️‍🌈方法二

这个问题困扰了我很长时间,如何看报错,是无法访问maven的中心仓库,就考虑是maven镜像没有使用上

然后打开设置,发现果然是这个问题

切换为下面的配置,问题就解决了

创建BookDaoimpl类

java 复制代码
package com.example.dao.impl;

import com.example.dao.BookDao;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoimpl implements BookDao {
    public void save(){
        System.out.println(System.currentTimeMillis());
        System.out.println("book dao save ...");
    }
    public void update(){
        System.out.println("book dao update ...");
    }
}

创建BookDao接口

java 复制代码
package com.example.dao;

public interface BookDao {
    public void update();

    void save();
}

创建MyAdvice类

在里面写入共性功能

java 复制代码
public void method(){
        System.out.println(System.currentTimeMillis());
    }

在里面写入切入点

java 复制代码
private void pt(){}

MyAdvice.java

java 复制代码
package com.example.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component  //读到是一个bean
@Aspect     //告诉你去识别下面的内容
public class MyAdvice {

//    切入点("执行(方法)")
    @Pointcut("execution(void com.example.dao.BookDao.update())")  //定义切入点
    private void pt(){}                                            //定义切入点

    @Before("pt()")                                                          //绑定切入点和通知
    public void method(){
        System.out.println(System.currentTimeMillis());
    } //定义通知
}


创建SpringConfig类

java 复制代码
package com.example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@ComponentScan("com.example")
@EnableAspectJAutoProxy  //告诉程序我们要使用注解开发aop 去识别MyAdvice里面的 @Aspect
public class SpringConfig {
}

创建App类

java 复制代码
package com.example;

import com.example.config.SpringConfig;
import com.example.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao=ctx.getBean(BookDao.class);
        bookDao.save();
    }
}

🎈结果


🌺AOP切入点表达式

  • 切入点:要进行增强的方法
  • 切入点表达式:要进行增强的方法的描述方式

⭐使用通配符加速配置

我们修改一下MyAdvice的代码,使用通配符表达式来写

⭐书写技巧

🎍AOP通知类型


AOP为我们提供了一种实现横向功能的clean方法,可以减少代码重复,降低模块间耦合。但它的使用需要我们思考非函数性需求的抽象与封装。在接下来的Spring学习中,我们还会看到AOP在事务管理等方面的典型应用。

本文只是AOP入门,实际应用中我们还需要学习更多知识,如AspectJ的使用、AOP性能优化等。如果你有任何疑问或想法,欢迎在评论区与我互动。让我们携手学习AOP,Build更优秀的Spring应用程序!

相关推荐
teacher伟大光荣且正确1 分钟前
关于Qt QReadWriteLock(读写锁) 以及 QSettings 使用的问题
java·数据库·qt
nightseventhunit4 分钟前
base64字符串String.getByte导致OOM Requested array size exceeds VM limit
java·oom
钱彬 (Qian Bin)12 分钟前
项目实践13—全球证件智能识别系统(内网离线部署大模型并调用)
数据库·postgresql·fastapi·ubuntu24.04·离线部署·qwen3大模型
hgz071013 分钟前
索引的原理
数据库
悟能不能悟20 分钟前
java map判断是否有key,get(key)+x,否则put(key,x)的新写法
java·开发语言
尋有緣30 分钟前
力扣614-二级关注者
大数据·数据库·sql·oracle
webbodys35 分钟前
Python文件操作与异常处理:构建健壮的应用程序
java·服务器·python
TG:@yunlaoda360 云老大35 分钟前
华为云国际站代理商的DDM支持哪些拆分算法?
数据库·算法·华为云
石工记37 分钟前
对称加密 vs 非对称加密图解详解
java·网络安全
咕噜企业分发小米1 小时前
腾讯云向量数据库的HNSW索引具体是如何构建和优化的?
数据库·云计算·腾讯云