spring aop 是怎么实现的
-
Spring AOP(面向切面编程)是通过代理机制实现的。具体而言,Spring AOP通过在运行时为目标对象动态创建一个代理对象,通过该代理对象来将横切逻辑(比如日志、事务管理等)与目标对象的业务逻辑分离开来。
在Spring AOP中,有两种常见的代理机制:JDK动态代理和CGLIB动态代理。
-
JDK动态代理:
JDK动态代理基于Java原生的动态代理机制。当目标对象实现了至少一个接口时,Spring AOP会使用JDK动态代理来创建代理对象。JDK动态代理要求目标对象实现接口,在运行时基于接口创建代理对象,代理对象能够调用接口中的方法,并在方法前后添加横切逻辑。 -
CGLIB动态代理:
CGLIB动态代理使用字节码生成库(Byte Code Generation Library)来动态创建目标对象的子类,通过继承目标对象的方式创建代理对象。CGLIB动态代理不要求目标对象实现接口,它能够代理没有实现接口的类。CGLIB动态代理通过继承的方式创建代理对象,并重写目标对象中的方法,在方法前后添加横切逻辑。
Spring AOP的实现流程如下:
- 声明切面:通过使用@AspectJ注解或者实现Aspect接口来定义切面。
- 配置切入点:使用@Pointcut注解来定义切入点,切入点用来确定哪些方法将被拦截。
- 编写通知:通过@Before、@After、@Around等注解来定义通知,通知指定了横切逻辑的执行时机。
- 创建代理对象:Spring AOP会在运行时动态创建代理对象,然后将代理对象注入到需要被代理的类中。
- 横切逻辑的执行:当代理对象调用被拦截的方法时,会按照切面中定义的通知顺序执行横切逻辑。
总而言之,Spring AOP通过代理机制实现对目标对象的方法拦截和横切逻辑的添加,从而实现了面向切面编程的特性。
1年前 -
-
Spring AOP (Aspect-Oriented Programming) 是一种面向切面编程的实现方式,它通过在应用程序中横切关注点(例如日志记录、事务管理、安全性等)与核心业务逻辑进行解耦,提供了更好的模块化和可维护性。
下面是 Spring AOP 的实现方式:
-
代理模式(Proxy Pattern):Spring AOP 使用代理模式来实现切面的横切逻辑。Spring 在运行时创建代理对象,将横切逻辑添加到代理对象中,并将代理对象用于替换原始对象。当应用程序调用原始对象的方法时,代理对象会在方法执行前后执行额外的横切逻辑。
-
动态代理(Dynamic Proxy):Spring AOP 使用动态代理来生成代理对象。动态代理是在运行时创建代理对象,而不是在编译时创建。Spring AOP 提供了两种动态代理方式:JDK 动态代理和 CGLIB 动态代理。
-
JDK 动态代理:这种代理方式基于接口,使用 Java 的 java.lang.reflect.Proxy 类动态生成代理对象。被代理的类必须实现一个接口,代理对象通过实现该接口来实现对被代理类的方法的代理。JDK 动态代理只能代理实现了接口的类。
-
CGLIB 动态代理:这种代理方式不需要被代理类实现接口,它通过生成被代理类的子类来创建代理对象。CGLIB(Code Generation Library)是一个开源的字节码生成类库,它通过扩展被代理类并重写其方法来实现代理功能。CGLIB 动态代理可以代理没有实现接口的类。
-
-
切面(Aspect):切面是一个模块化的横切关注点,在 Spring AOP 中以类的形式表示。一个切面包含了多个通知(Advices)和一个切点(Pointcut)。通知定义了在何时、何地执行横切逻辑,切点定义了在哪些方法上执行横切逻辑。
-
通知(Advice):通知定义了在什么时候执行横切逻辑,并提供了横切逻辑的具体实现。Spring AOP 提供了以下几种通知类型:
- 前置通知(Before Advice):在方法执行之前执行横切逻辑。
- 后置通知(After Advice):在方法执行之后执行横切逻辑,无论方法是否抛出异常。
- 返回通知(After Returning Advice):在方法执行之后执行横切逻辑,仅在方法成功返回时执行。
- 异常通知(After Throwing Advice):在方法抛出异常后执行横切逻辑。
- 环绕通知(Around Advice):在方法执行之前和之后执行横切逻辑。
-
切点(Pointcut):切点是一个表达式,用于定义在哪些方法上执行横切逻辑。Spring AOP 使用 AspectJ 的切点表达式语言来定义切点。开发人员可以通过使用切点表达式来选择特定的方法,例如按名称、参数类型、返回类型等进行匹配。切点表达式可以在 XML 配置文件或注解中定义。
总结起来,Spring AOP 通过动态代理和切面的概念来实现切面编程,提供了一种解耦横切逻辑和核心业务逻辑的方式。通过配置切面、通知和切点,开发人员可以将横切逻辑应用到应用程序中的多个方法上,实现代码的重用和模块化。
1年前 -
-
Spring AOP(面向切面编程)是Spring框架中的一个核心特性,通过在方法执行的前后插入切面(Aspect)来实现横切关注点(cross-cutting concerns)的功能。在Spring AOP中,切面将与目标对象进行动态连接,以实现在目标对象的方法执行过程中插入特定行为的目的。
Spring AOP的实现依赖于动态代理技术。Spring框架提供了两种代理机制:基于JDK的动态代理和基于CGLIB的动态代理。JDK动态代理实现基于接口的代理,而CGLIB动态代理实现基于类的代理。Spring AOP默认情况下使用JDK动态代理,当目标对象没有实现接口时,会自动切换为CGLIB动态代理。
下面是Spring AOP的实现步骤:
-
定义切面:切面是一个类,其中包含了通知(Advice,需要在方法执行前后执行的操作)和切点(Pointcut,指定哪些方法应该被增强)。通常情况下,切面会被标注为一个特定的注解,如@Aspect。
-
开启AOP支持:在Spring配置文件中,需要通过使用
<aop:config>元素来开启对AOP的支持。这将使得Spring容器扫描所有的切面类,并将这些切面应用到相应的目标对象上。 -
创建代理对象:Spring框架会为目标对象创建一个代理对象,该代理对象将包装目标对象,并根据切面的定义,在方法执行前后插入切面的代码。
-
执行代理调用:当通过代理对象调用目标对象的方法时,代理对象会根据切面的定义,先执行切面中的通知代码,然后再调用目标对象的方法。在通知代码中,可以通过JoinPoint对象访问方法的执行参数、返回值等信息。
-
根据切点匹配执行通知:在执行代理调用时,Spring AOP会根据切点的定义来决定是否执行通知。切点可以通过表达式语言来定义,如基于方法名、类名、注解等进行匹配。
需要注意的是,Spring AOP只能作用于Spring管理的Bean上。当目标对象是通过Spring IoC容器来创建并管理的时,AOP才会生效。
总而言之,Spring AOP通过动态代理来实现方法的增强,将切面的通知代码与目标对象的方法结合起来,实现横切关注点的功能。可以通过定义切面、开启AOP支持以及使用切点匹配执行通知的方式来使用Spring AOP。
1年前 -