【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应用程序!

相关推荐
火烧屁屁啦21 分钟前
【JavaEE进阶】初始Spring Web MVC
java·spring·java-ee
w_312345434 分钟前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安37 分钟前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA40 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
北辰浮光42 分钟前
[spring]XML配置文件标签
xml·spring
Q_19284999061 小时前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
sdaxue.com1 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
张国荣家的弟弟1 小时前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S1 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法