【Spring】Spring AOP 初识及实现原理解析

9 篇文章 0 订阅
订阅专栏

  • 博主简介:想进大厂的打工人
  • 博主主页: @xyk:
  • 所属专栏:  JavaEE进阶 

目录

文章目录

一、初识AOP

1.1 什么是AOP?

1.2 AOP的组成

1.2.1 切面(Aspect)

1.2.2 切点(Pointcut)

1.2.3 连接点(Join Point)

1.2.4 通知(Advice)

1.3 AOP的使用场景

二、Srping AOP 实现

2.1 添加Spring AOP 依赖

2.2 定义切面和切点

2.3 定义通知

三、Spring AOP 实现原理

3.1 什么是动态代理?

3.2 JDK 动态代理实现

3.3 CGLIB 动态代理实现

3.4 JDK 和 CGLIB 实现的区别


一、初识AOP

1.1 什么是AOP?

AOP(Aspect Oriented Programming):面向切面编程,它是⼀种思想,它是对某⼀类事情的
集中处理。
在我们想要对某一件事情进行集中处理,就可以使用到AOP,它提供一种将程序中的横切关注点 模块化的方式。在 AOP 中,我们将这些横切关注点称为“切面”,它们独立于业务逻辑模块,但是可以在程序运行的不同阶段被织入到业务逻辑中。

简单来说,AOP 就是对某一件事进行集中处理的思想方式~

1.2 AOP的组成

1.2.1 切面(Aspect)

切⾯(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包
括了连接点的定义。相当于处理某方面具体问题的一个类,包含多个方法,而这些方法就是切点和通知。

1.2.2 切点(Pointcut)

Pointcut 的作⽤就是提供⼀组规则来匹配连接点(Join Point),给满足规则的连接点添加通知(Advice),可以理解为用来进行主动拦截的规则(配置)

1.2.3 连接点(Join Point)

应⽤执⾏过程中能够插⼊切⾯的⼀个点,连接点可以理解为可能会触发AOP规则的所有点。(所有请求)

1.2.4 通知(Advice)

在AOP术语中,切面的工作被称之为通知。通知是切面在连接点上执行的动作。它定义了在何时(例如在方法调用之前或之后)以及如何(例如打印日志或进行性能监控)应用切面的行为。即,程序中被拦截请求触发的具体动作。

Spring 切⾯类中,可以在方法上使⽤以下注解,会设置⽅法为通知方法,在满⾜条件后会通知本
⽅法进⾏调⽤:

  1. 前置通知使⽤ @Before:通知⽅法会在⽬标⽅法调⽤之前执行。
  2. 后置通知使⽤ @After:通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤。
  3. 返回之后通知使⽤ @AfterReturning:通知⽅法会在⽬标⽅法返回后调⽤。
  4. 抛异常后通知使⽤ @AfterThrowing:通知⽅法会在⽬标⽅法抛出异常后调⽤。
  5. 环绕通知使⽤ @Around:通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执行⾃定义的行为。

1.3 AOP的使用场景

在做任何一个系统都需要登录功能,那么几乎想要使用这个系统都需要我们进行验证用户登录状态,我们之前的处理⽅式是每个 Controller 都要写⼀遍⽤户登录验证,然⽽当你的功能越来越多,那么你要写的登录验证也越来越多,⽽这些⽅法⼜是相同的,这么多的⽅法就会代码修改和维护的成本。对于这种功能统⼀,且使⽤的地⽅较多的功能,就可以考虑 AOP来统⼀处理了。

 

除了统一登录判断外,使用AOP还可以实现:

  • 用户登录验证
  • 统⼀⽇志记录
  • 统⼀⽅法执⾏时间统计
  • 统⼀的返回格式设置
  • 统⼀的异常处理
  • 事务的开启和提交等

二、Srping AOP 实现

Spring AOP 的实现步骤如下:

  1. 添加 Spring AOP 框架⽀持
  2. 定义切⾯和切点:(1)创建切面类(2)配置拦截规则
  3. 定义通知

2.1 添加Spring AOP 依赖

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-bo
ot-starter-aop -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2.2 定义切面和切点

使用 @Aspect 注解表明当前类为一个切面,而在切点中,我们要定义拦截的规则,具体实现如下:

@Component // 随着框架的启动而启动
@Aspect // 告诉框架我是一个切面类
public class UserAspect {

    // 定义切点(配置拦截规则)
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut(){

    }
}

在上述实现代码中,pointcut 为一个空方法,只是起到一个“标识”的作用,标识下面的通知方法具体指的是哪个切点,切点可以有多个。

切点表达式由切点函数组成,其中 execution() 是最常⽤的切点函数,⽤来匹配⽅法,语法为:

execution(<修饰符><返回类型><包.类.⽅法(参数)><异常>)
修饰符和异常可以省略

常见的切点表达式的示例:

  • 匹配特定类的所有方法:
  • execution(* com.example.MyClass.*(..)):匹配 com.example.MyClass 类中的所有方法。
  • 匹配特定包下的所有方法:
  • execution(* com.example.*.*(..)):匹配 com.example 包及其子包下的所有方法。
  • 匹配特定方法名的方法:
  • execution(* com.example.MyClass.myMethod(..)):匹配 com.example.MyClass 类中名为 myMethod 的方法。
  • 匹配特定方法参数类型的方法:
  • execution(* com.example.MyClass.myMethod(String, int)):匹配 com.example.MyClass 类中具有一个 String 参数和一个 int 参数的 myMethod 方法。
  • 匹配特定返回类型的方法:
  • execution(String com.example.MyClass.myMethod(..)):匹配 com.example.MyClass 类中返回类型为 String 的 myMethod 方法。
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/hi")
    public String sayHi(String name){
        System.out.println("执行了Hi");
        return "Hi," + name;
    }

    @RequestMapping("/hello")
    public String sayHello(){
        System.out.println("执行了Hello");
        return "Hello,world";
    }
}

2.3 定义通知

通知定义的是被拦截方法具体要执行的业务。我们上面列出了可以使用哪些通知~这里举出例子

package com.example.demo.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component // 随着框架的启动而启动
@Aspect // 告诉框架我是一个切面类
public class UserAspect {


    // 定义切点(配置拦截规则)
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut(){

    }

    @Before("pointcut()")
    public void beforeAdvice(){
        System.out.println("执行了前置通知~");
    }

    @After("pointcut()")
    public void AfterAdvice(){
        System.out.println("执行了后置通知~");
    }

    /**
     * 环绕通知
     * @param joinPoint
     * @return
     */
    @Around("pointcut()")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint){
        System.out.println("进入了环绕通知~");
        Object obj = null;
        try {
        // 执⾏拦截⽅法
            obj = joinPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("退出了环绕通知~");
        return obj;
    }

}

环绕通知是在前置通知之前和后置通知之后运行的~

  

三、Spring AOP 实现原理

Spring AOP 是通过动态代理的⽅式,在运⾏期将 AOP 代码织⼊到程序中的,它的实现⽅式有两种:JDK Proxy 和 CGLIB因此,Spring 对 AOP 的支持局限于方法级别的拦截。

  1. 默认情况下,实现了接⼝的类,使⽤ AOP 会基于 JDK ⽣成代理类
  2. 没有实现接⼝的类,会基于 CGLIB ⽣成代理类
     

3.1 什么是动态代理?

动态代理(Dynamic Proxy)是一种设计模式,它允许 在运行时创建代理对象,并将方法调用转发给实际的对象。 动态代理可以用于实现横切关注点(如日志记录、性能监控、事务管理等)的功能,而无需修改原始对象的代码。

在Java中,动态代理通常使用 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来实现。

调用者在调用方法时,会先转发给代理类创建的代理对象,随后再由代理对象转发给目标对象。

以下是使用动态代理的一般步骤:

  1. 创建一个实现InvocationHandler接口的类,该类将作为代理对象的调用处理程序。在InvocationHandler接口的invoke方法中,可以定义在方法调用前后执行的逻辑。
  2. 使用Proxy类的newProxyInstance方法创建代理对象。该方法接受三个参数:类加载器、代理接口数组和调用处理程序。它将返回一个实现指定接口的代理对象。
  3. 使用代理对象调用方法。当调用代理对象的方法时,实际上会调用调用处理程序的invoke方法,并将方法调用转发给实际的对象。
     

3.2 JDK 动态代理实现

先通过实现 InvocationHandler 接⼝创建⽅法调⽤处理器,再通过 Proxy 来创建代理类。

import org.example.demo.service.AliPayService;
import org.example.demo.service.PayService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理:使⽤JDK提供的api(InvocationHandler、Proxy实现),此种⽅式实现,要求被代理类必须实现接⼝
public class PayServiceJDKInvocationHandler implements InvocationHandler {
    //⽬标对象即就是被代理对象
    private Object target;
    public PayServiceJDKInvocationHandler( Object target) {
        this.target = target;
    }
    //proxy代理对象
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //1.安全检查
        System.out.println("安全检查");
    //2.记录⽇志
        System.out.println("记录⽇志");
    //3.时间统计开始
        System.out.println("记录开始时间");
    //通过反射调⽤被代理类的⽅法
        Object retVal = method.invoke(target, args);
    //4.时间统计结束
        System.out.println("记录结束时间");
        return retVal;
    }
    public static void main(String[] args) {
        PayService target= new AliPayService();
    //⽅法调⽤处理器
        InvocationHandler handler =
                new PayServiceJDKInvocationHandler(target);
    //创建⼀个代理类:通过被代理类、被代理实现的接⼝、⽅法调⽤处理器来创建
        PayService proxy = (PayService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                new Class[]{PayService.class},
                handler
        );
        proxy.pay();
    }
}

3.3 CGLIB 动态代理实现

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import org.example.demo.service.AliPayService;
import org.example.demo.service.PayService;
import java.lang.reflect.Method;

public class PayServiceCGLIBInterceptor implements MethodInterceptor {
    //被代理对象
    private Object target;
    public PayServiceCGLIBInterceptor(Object target){
        this.target = target;
    }
    @Override
    public Object intercept(Object o, Method method, Object[] args, Method
            Proxy methodProxy) throws Throwable {
//1.安全检查
        System.out.println("安全检查");
//2.记录⽇志
        System.out.println("记录⽇志");
//3.时间统计开始
        System.out.println("记录开始时间");
//通过cglib的代理⽅法调⽤
        Object retVal = methodProxy.invoke(target, args);
//4.时间统计结束
        System.out.println("记录结束时间");
        return retVal;
    }
    public static void main(String[] args) {
        PayService target= new AliPayService();
        PayService proxy= (PayService) Enhancer.create(target.getClass(),n
                ew PayServiceCGLIBInterceptor(target));
        proxy.pay();
    }
}

3.4 JDK 和 CGLIB 实现的区别

  1. JDK 实现,要求被代理类必须实现接口, 之后是通过 InvocationHandler 及 Proxy,在运⾏时动态的在内存中⽣成了代理类对象,该代理对象是通过实现同样的接⼝实现(类似静态代理接⼝实现的⽅式),只是该代理类是在运⾏期时,动态的织⼊统⼀的业务逻辑字节码来完成。
  2. CGLIB 实现,被代理类可以不实现接口, 是通过继承被代理类,在运⾏时动态的⽣成代理类对象。
图文详解Spring AOP,你学会了吗?
qq_39652397的博客
04-28 2996
如果说 IOC 是 Spring 的核心,那么面向切面编程AOP就是 Spring 另外一个最为重要的核心,需要重点掌握@mikechen 本篇主要会详解以下六点: 1.AOP的定义 2.AOP的作用 3.AOP的应用场景 4.Spring AOP的术语 AOP核心概念 Spring AOP 通知分类 Spring AOP 织入时期 5.Spring AOP三种使用方式 方式1:使用Spring自带的AOP 方式2:使用Aspectj实现切面(普通POJO的实现方式) 方式3:使用As
Spring基础篇之初识DI和AOP
08-28
主要为大家详细介绍了Spring基础篇之初识DI和AOP,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Spring高手之路18——从XML配置角度理解Spring AOP
最新发布
卓越无关环境,保持空杯心态——靡不有初,鲜克有终
05-12 1万+
本文是全面解析面向切面编程的实践指南。通过深入讲解切面、连接点、通知等关键概念,以及通过XML配置实现Spring AOP的步骤。
SpringAOP的实现机制(底层原理)、应用场景等详解
Stevedash的博客
09-09 641
​JDK动态代理和CGLib动态代理都是Java中用于实现代理模式的技术,它们允许我们创建代理对象来控制对其他对象的访问。JDK动态代理:JDK动态代理要求目标类实现接口,代理对象也必须实现与目标对象相同的接口。JDK动态代理使用接口来创建代理对象,该接口包含一个方法invoke,在代理对象的方法被调用时,该方法会被执行。使用类来创建代理对象。JDK动态代理只能代理实现了接口的类,无法代理没有实现接口的类。
SpringAOP实现原理
qq_44918331的博客
03-11 1万+
一、什么是 AOPAOP(Aspect-Oriented Programming,面向方面编程),对 OOP(Object-Oriented Programming,面向对象编程) 【OOP与AOP】 概念 AOP(Aspect-Oriented Programming,面向方面编程) OOP(Object-Oriented Programming,面向对象编程) 方向 OOP 定义从上到下的关系 AOP 定义从左到右的关系 【两个部分】 核心关注点 业务处理的主要流程
Spring AOP的三种实现方式
热门推荐
BAI20010904的博客
01-14 1万+
目录 一、什么是AOP 二、Spring AOP的三种实现方式 1.通过Spring API实现AOP (1)编写业务接口和实现类 (2)编写增强类,并实现Spring API相关接口的方法 (3)在resource目录下新建applicationContext文件,实现java类的创建和aop的织入 (4)编写测试类 2.通过自定义类来实现(推荐) (1)自定义切入类 (2)去spring中配置 (3)编写测试类 3.使用注解实现 (1)自定义增强类(注解实现) (2)..
Java AOP实践指南:切面编程详解
xuewenyu_的博客
11-06 2929
通过本文的讲解,我们深入了解了切面编程的核心概念、动态代理的实现原理,并通过一个实际的例子展示了使用Java AOP的完整过程。AOP可以帮助我们将横切关注点(例如日志记录、事务管理等)从核心业务逻辑中解耦出来,提高代码的可维护性和重用性。同时,AOP也是实现设计模式和架构思想的重要手段之一,我们在开发中可以灵活运用AOP来优化代码结构并提高系统的整体性能。
SpringBoot Aop 详解和多种使用场景
Leo_Wcg的博客
09-26 188
aop
深入解析Java Spring框架
03-04
我们将深入研究Spring的核心组件,如IoC容器、AOP模块、数据访问层、Web模块等,揭示其在应用开发中的关键作用。 二、个人心得体会 2.1 初识Spring的感受 分享我初次接触Spring的经历,包括遇到的挑战和对框架的第...
spring-AOP面向切面编程所需jar包.zip
06-22
该压缩包包含--学习笔记(05):轻松搞定Spring全家桶(初识篇)-面向切片编程AOP:--系列博客中新需要的三个jar包。包括spring-aspects-5.2.7.RELEASE.jar和spring-aop-5.2.7.RELEASE.jar和...
SSM框架的学习与应用-Java EE企业级应用开发学习记录-(第六天)初识Spring框架
08-30
本资源是一篇关于学习和应用SSM框架(SpringSpringMVC、MyBatis)的学习记录系列文章中的第六天内容,主题为初识Spring框架。 在这一部分中,你将了解到Spring框架的基本概念和使用方法,并通过实例探讨了Spring ...
Spring框架、SpringMVC框架、Maven高级(缺)、SpringBoot框架、MyBatis-Plus框架
04-06
1.1 初识 Spring,我们了解到 Spring 是为了简化企业级 Java 应用程序的开发而设计的,它通过提供一种声明式编程模型,减少了代码量和耦合度。 1.2 Spring 系统架构主要包括四个主要模块:Core Container(核心容器...
Spring-AOP 讲解
qq_45906101的博客
10-22 180
我们知道,在我们的项目中,会出现核心代码和非核心代码,对于非核心代码,在各个方法中可能是冗余的,此时为了解决这种非核心代码的冗余以及不方便管理的问题,就出现了AOP思维。
springboot使用aop以及原理分析
dap769815768的博客
06-28 1590
Java架构师交流群:793825326 java版本:jdk1.8 IDE:Idea2019 Springboot:2.1.6.RELEASE 1.pom: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-s...
spring源码解析AOP原理
韩猿外的博客
06-05 757
上一步我发现AnnotationAwareAspectJAutoProxyCreator在所有bean创建时进行了拦截,执行其中的postProcessBeforeInstantiation方法,接下来我们继续通过断点调试查看该方法的进行的操作。我们继续完善之前的流程.。创建代理对象过程中,会先创建一个代理工厂,获取到所有的增强器(通知方法),将这些增强器和目标类注入代理工厂,再用代理工厂创建对象。我们细看创建代理对象的过程,发现在创建之前首先会根据切入点表达式对增强器进行一一匹配,最终拿到所有的增强器。
一篇文章详细解读SpringAOP原理过程(Spring面向切面详解)
qq_39746820的博客
04-28 7016
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
Spring系列之AOP实现的两种方式
u013733643的博客
04-08 2696
AOP常用的实现方式有两种,一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ)。 首先复习下AOP中一些比较重要的概念: Joinpoint(连接点):程序执行时的某个特定的点,在Spring中就是某一个方法的执行 。Pointcut(切点):说的通俗点,springAOP的切点就是指一些方法的集合,而这些方法是需要被增强、被代理的。一般都是按照一定的约定规则来表示的,如正则表达式等。切点是由一类连接点组成。Advice(通知):还是说的通俗点,就是在指定切点上
AOP切面实现原理以及多个切面切同一个地方时的优先级讲解
dianshan5893的博客
04-13 1262
此博文的编写,源于前段时间的惨痛面试经历。刚好近几天尘埃落定、手头事少,遂总结一二,与各位道友分享,欢迎吐槽指正。今年年初的这段面试经历,已于之前的博文中 整理发出(https://www.cnblogs.com/zzq6032010/p/10492109.html)。不会不丢人,但如果不会还不去整理总结、不去学习,这才是最丢人的!闲话少叙,下面开始正文。 注:本文是...
Java-由源代码分析Spring AOP实现原理
了解➔熟悉➔掌握➔精通
12-08 421
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 什么是AOP AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许
springaop和ioc实现原理
06-28
### 回答1: SpringAOP和IOC实现原理AOP(面向切面编程)是Spring框架的一个重要特性,它通过在运行时动态地将代码切入到类的方法中,实现了对业务逻辑的解耦和横向切割。SpringAOP实现原理是基于动态代理和字节码生成技术,通过在运行时动态地生成代理对象,将切面逻辑织入到目标对象的方法中。 IOC(控制反转)是Spring框架的另一个重要特性,它通过将对象的创建和依赖关系的管理交给Spring容器来实现,从而实现了对象之间的解耦和灵活性。Spring的IOC实现原理是基于反射和XML配置文件,通过读取配置文件中的信息,动态地创建对象并注入依赖关系,从而实现了对象的管理和控制。 ### 回答2: Spring框架作为Java企业应用中广泛使用的开发框架,其内部实现的AOP和IOC功能是其较为重要的组成部分。AOP(面向切面编程)和IOC(控制反转)是两个不同的概念,但它们之间存在紧密联系。在回答任何一个问题之前,需要更深入地了解这些术语以及它们的目的。 首先,了解AOP实现原理AOP的主要原理是将整个应用程序分解成特定的相关部分,并标识出这些部分的职责。然后,AOP框架将横切关注点(Crosscutting Concerns)划分为一个个切面(Aspect),并实现将目标对象在运行时交织上这些切面的功能。这个交织的过程称为织入(Weaving),这样应用程序中的某些功能可以在运行时动态地添加到对象中,而无需对其进行静态编码。在Spring框架中,主流的AOP实现采用代理模式(Proxy)。它将目标对象和切面运作在代理对象之间,代理对象则在运行时插入切面功能。 其次,了解IOC的实现原理。控制反转是指将对象间的依赖关系的控制权从目标对象自身转移到容器中管理,从而实现对象的松耦合。Spring框架是典型的IOC容器,它利用依赖注入(Dependency Injection)技术,通过在配置文件(XML或JavaConfig)中定义对象之间的依赖关系,在容器中实例化对象并完成之间的依赖注入。在依赖注入中,容器将对象之间的依赖关系检测到,并自动为其中的依赖添加实例。这样,程序员就不需要在代码中显式地将对象之间的依赖关系硬编码,而可以通过注解、XML配置文件或JavaConfig等方式来管理这些对象。 综上所述,AOP和IOC是Spring框架的核心概念之一。通过使用Spring框架的AOP和IOC功能,开发人员可以编写更简洁、高效的代码,并更容易地实现面向对象编程的最佳实践。 ### 回答3: SpringAOP和IOC(控制反转)是Spring框架中非常重要的两个部分,能够让开发人员更好的实现面向切面编程和解耦,提高代码可维护性和灵活性。 首先,让我们来看看Spring的IOC实现原理Spring的IOC是控制反转的实现,即通过容器管理对象之间的依赖关系,而不是在代码中直接通过new关键词来创建对象。Spring的IOC实现的核心思想是依赖注入(Dependency Injection,DI),即对象通过Setter、构造函数、注解等方式获取它所需要的依赖对象。通过Spring容器来管理和维护所有应用程序需要的对象实例和依赖关系。在实现IOC的时候,Spring会通过配置文件或者注解方式把对象的创建、初始化和依赖注入关系都详细地描述出来,然后在运行时,通过反射机制自动创建对象,再将依赖注入进去,以此实现对象的控制权转由Spring容器来掌控。这样的实现可以减轻程序员的工作负担,提高程序的复用性和扩展性。 其次,SpringAOP实现原理也是很重要的。AOP可以让程序员将一些横切逻辑和业务处理逻辑分离出来,达到代码解耦的目的。在Spring中,AOP使用代理(Proxy)的方式实现,通过对需要执行的目标方法进行拦截,并在目标方法执行前后执行额外的逻辑,如开启/关闭事务、安全认证、日志记录等。代理类可以使用JDK自带的动态代理机制或CGLIB等第三方代理框架来生成,而切面对象则负责维护切面所需要拦截的目标对象、目标方法、切面执行顺序等信息。SpringAOP框架为切面提供丰富的表达式语言来指定需要拦截的方法,如通配符、正则表达式和AspectJ注解等。 因此,SpringAOP和IOC实现原理都是非常重要的,它们的实现可以让应用程序代码更灵活、更容易维护,同时也使得程序员的工作更加高效。但是需要注意的是,在使用SpringAOP和IOC时,要注意配置的正确性和合理性,否则可能会带来一些潜在的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • (新手必看)HashMap是什么? 16030
  • 【mysql】聚簇索引和非聚簇索引(B树和B+树) 8781
  • C语言实现扫雷游戏完整代码 8133
  • Java开发实现图书管理系统(超详细) 8002
  • 线程池是什么?线程池(ThreadPoolExecutor)使用详解 5331

分类专栏

  • 软件测试 1篇
  • JavaEE进阶 9篇
  • mysql 2篇
  • JavaEE初阶 30篇
  • oj习题总结
  • 笔试强训 6篇
  • Java专栏 10篇
  • 数据结构 11篇
  • C专栏 14篇

最新评论

  • 【mysql】聚簇索引和非聚簇索引(B树和B+树)

    NotRepent: 文章太给力了,真不错,学习了表情包

  • 【mysql】聚簇索引和非聚簇索引(B树和B+树)

    xyk:: 笔误笔误

  • 【mysql】聚簇索引和非聚簇索引(B树和B+树)

    NotRepent: 第三次IO 不应该是将磁盘块6加载到内存开始遍历吗?在内存 中从头开始遍历10=10 找到

  • 【JavaEE】死锁是什么?如何避免死锁(保姆级讲解)

    头大不愁: 有没有可能小号也同意了表情包

  • 【软件测试】随笔系统测试报告

    cmdch2017: selenium现在很少用了吧,主要还是需要另外下载chrome对应版本的驱动太麻烦,所以cypress、playwright用的会更多

大家在看

  • 华为OD机试真题-游戏分组-2023年OD统一考试(C卷) 60
  • HTML表单标签 579
  • 【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验4 集线器和交换机的区别
  • python基础语法 756
  • 初学者学习软件测试指南:常见测试类型详解

最新文章

  • 【软件测试】随笔系统测试报告
  • 【Spring Boot】拦截器与统一功能处理
  • 【SpringBoot】日志是什么+基于lombok的日志输出
2023年71篇
2022年17篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司龙华SEO按天计费龙岗英文网站建设宝安网络营销坪山网站改版坪山SEO按天扣费沙井关键词排名包年推广坑梓网站开发沙井网页制作惠州seo网站推广松岗关键词排名包年推广民治网站改版南澳SEO按天计费爱联模板推广沙井模板制作双龙网站制作设计惠州百度竞价包年推广塘坑百度爱采购宝安关键词排名荷坳企业网站建设坪山英文网站建设南山seo排名爱联关键词按天扣费大芬关键词按天收费同乐SEO按天收费沙井阿里店铺托管布吉网站优化软件福田网站优化光明网站优化按天收费深圳百姓网标王推广沙井网站推广歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化