Spring核心功能——AOP(面向切面编程)

2024-09-04 08:44

本文主要是介绍Spring核心功能——AOP(面向切面编程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

AOP

1 介绍

2 AOP术语

3 应用场景

4 演示


 

AOP

1 介绍

Spring中另外一个核心功能,AOP


AOP(Aspect Oriented Programming),即面向切面编程.

OOP(Object Oriented Programming ),即面向对象编程.

AOP面向切面编程,利用 一种称为"横切"的技术,剖开封装的对象内部,并将那些影响了 多个类的公共行为抽取出封装到一个可重用模块),并将其命名 为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

 

面向切面编程的作用:就是将项目中与核心逻辑无关的代码横向抽取成切面类,通过织入作用到目标方法,以使目标方法执行前后达到增强的效果.

原理: AOP底层使用的就是动态代理,给AOP指定哪些类型(目标类)需要增强,就会产生对应的代理对象,代理对象执行方法前后会先执行增 强的方法.

好处:减少系统的重复代码,降低模块之间的耦合度,便于维护,可以只关注核心业务

补充:
AOP底层实现原理是代理设计模式,且是动态代理

动态代理(jdk动态代理技术 / cglib动态代理技术)

jdk代理技术,要求目标类必须是接口
cglib代理技术, 目标类可以是接口也可以是类

2 AOP术语

连接点(Joinpoint):连接点是程序类中客观存在的方法,可被Spring拦截并切入内容。即每个方法在切入之前,都是连接点

切入点(Pointcut):被Spring切入连接点。即真正会增强的目标方法

通知、增强(Advice):可以为切入点添加额外功能,分为:前置通知、后置通知、异常通知、环绕通知等。

目标对象(Target):被代理的目标对象

织入(Weaving):把通知应用到具体的类,进而创建新的代理类的过程。

代理(Proxy):被AOP织入通知后,产生的结代理类。

切面(Aspect):由切点和通知组成

3 应用场景

  • 事务管理

    • 后续spring管理事务用的AOP原理

  • 权限校验

    • 后期使用Spring Security注解开发时,其实利用了AOP思想

  • 日志记录

  • 性能检测

  • 等等

4 演示

需求: 实现业务层代码执行时,能出现一些增强的效果

一般写在service层是咱们要被增强的地方

开发步骤

  1. 创建切面类,类上加注解

    • @Component ,加上该注解,springboot框架就会创建该类对象

    • @Aspect , 加上该注解,springboot框架内部就会知道该类是一个切面类

    • 设置切入点方法,并加注解

      • @Pointcut , 用于定义要增强的目标方法路径

  1. 设置各种增强(或者叫通知)方法

  • 注解解释
    @Around环绕通知
    @Before前置通知
    @After后置通知
    @AfterReturning后置返回通知
    @AfterThrowing异常通知

1.pom.xml添加aop依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Date;import javax.servlet.http.HttpServletRequest;import com.qf.annotation.MyLog;
import com.qf.model.Log;
import com.qf.model.User;
import com.qf.service.MyLogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.util.WebUtils;/*** @Author yhf* @Date 2024/9/3* @Desc 200不是二百*/
@Component
@Aspect
public class MyLogAspect {// 注入业务层对象@Autowiredprivate MyLogService logService;// 切入的目标是注解@Before("@annotation(com.qf.annotation.MyLog)")public void after(JoinPoint joinPoint) {// 调用下方自定义方法,获得注解中的值String desc = getAnnoDesc(joinPoint);System.out.println("注解中的值:" + desc);// 以下代码需要使用Springmvc,既控制层也需要由Spring托管,才会获得ipHttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes( )).getRequest( );// 能取出数据的前提是登录时将用户信息存储到sessionUser user = (User) WebUtils.getSessionAttribute(request, "user");String name = "未登录";if (user != null) { // 防止出现空指针异常name = user.getName( );}//ipString ip = request.getRemoteAddr( );System.out.println("请求对象的ip:" + ip);// 封装数据Log log = new Log( );log.setName(name);log.setIp(ip);log.setLogTime(new Date());log.setLog(desc);// 调用业务层,执行插入logService.insertLog(log);}/** 封装的方法,通过反射技术获得目标方法上的注解的值*/public static String getAnnoDesc(JoinPoint joinPoint) {String value = "";try {MethodSignature signature = (MethodSignature) joinPoint.getSignature( );// 获得目标方法对象Method method = signature.getMethod( );// 获得目标方法对象上的日志注解MyLog myLog = method.getDeclaredAnnotation(MyLog.class);// 获得日志注解上的值value = myLog.value( );} catch (Exception e) {throw new RuntimeException(e);}return value;}

 

这篇关于Spring核心功能——AOP(面向切面编程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135542

相关文章

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使