Spring AOP 三大必备 JAR 包深入解析

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Spring 框架在 AOP 方面提供了全面支持。本文将深入探讨 Spring AOP 使用的三个必备 JAR 包:aspectjrt.jar、aspectjweaver.jar 和 aopalliance-1.0.0.jar。我们将了解每个 JAR 包在 Spring AOP 中的角色,包括 AspectJ 运行时支持、字节码织入和 AOP 框架间的接口定义。通过理解这些基础组件,开发者可以更有效地使用 Spring AOP,编写解耦和模块化的代码。 Spring使用AOP的三个jar包

1. Spring AOP 简介

Spring AOP(面向切面编程)是一种强大的技术,用于在不修改现有代码的情况下,以非侵入方式增强应用程序行为。它通过使用切面来实现,切面是一种可重用模块,可以拦截应用程序中的方法调用并执行自定义逻辑。Spring AOP 提供了丰富的 API 和注解,使开发人员能够轻松地创建和应用切面,从而实现诸如日志记录、安全和性能优化等常见任务。

2. AspectJ 运行时支持

2.1 AspectJrt.jar:核心运行时库

AspectJrt.jar 是 AspectJ 运行时支持库,提供 AspectJ 增强功能所需的底层基础设施。它包含以下关键组件:

  • AspectJWeaver: 负责将 AspectJ 增强应用到目标字节码。
  • AspectClassLoader: 加载和管理增强后的类。
  • AspectOf: 提供 AspectJ 增强所需的元数据。

要使用 AspectJ 运行时支持,需要将 AspectJrt.jar 添加到类路径中。这可以通过在 Java 编译命令或应用程序服务器配置中指定库路径来实现。

2.2 织入机制和原理

AspectJ 织入是将 AspectJ 增强应用到目标字节码的过程。织入机制涉及以下步骤:

  1. 字节码加载: 目标类由 Java 虚拟机 (JVM) 加载到内存中。
  2. 增强: AspectJWeaver 拦截字节码加载过程,并根据 AspectJ 增强规则对目标类进行增强。
  3. 加载增强后的类: 增强后的类由 AspectClassLoader 加载到内存中。
  4. 实例化: 增强后的类被实例化,并应用 AspectJ 增强。

AspectJ 织入原理基于 Java 字节码操纵技术。AspectJWeaver 使用 Java 反射 API 访问和修改目标类的字节码,将 AspectJ 增强代码注入到目标类中。

织入时机

AspectJ 织入可以在以下两个阶段进行:

  • 编译时织入: 在编译目标类时进行织入。这需要使用 AspectJ 编译器,它将 AspectJ 增强直接编译到目标类中。
  • 运行时织入: 在应用程序运行时进行织入。这需要使用 AspectJ 运行时支持,它将 AspectJ 增强应用到已加载的类中。

织入范围

AspectJ 织入可以应用于以下范围:

  • 类: 将 AspectJ 增强应用到整个类。
  • 方法: 将 AspectJ 增强应用到特定方法。
  • 字段: 将 AspectJ 增强应用到特定字段。

织入方式

AspectJ 织入可以通过以下两种方式进行:

  • 静态织入: 在编译时或应用程序启动时进行织入。
  • 动态织入: 在应用程序运行时进行织入。

3. 字节码织入

3.1 Aspectjweaver.jar:字节码增强工具

Aspectjweaver.jar 是 AspectJ 框架中用于字节码增强的核心工具。它是一个 Java 应用程序,可以对 Java 字节码进行修改,以实现 AspectJ 方面(Aspect)的织入。

3.1.1 织入原理

Aspectjweaver 使用字节码增强技术,在编译后的 Java 字节码中插入额外的代码,以实现方面逻辑的执行。具体过程如下:

  1. 加载目标类字节码: Aspectjweaver 加载需要织入的 Java 类字节码。
  2. 解析方面定义: 解析 AspectJ 方面定义,包括切点表达式、通知方法和关联的类。
  3. 匹配切点: 根据切点表达式,确定需要织入的代码位置。
  4. 生成增强字节码: 在匹配的代码位置插入额外的字节码,以实现方面逻辑的执行。
  5. 输出增强字节码: 输出增强后的 Java 字节码,替换原始字节码。

3.1.2 参数说明

Aspectjweaver 接受以下主要参数:

| 参数 | 描述 | |---|---| | -injar | 输入 JAR 文件,包含需要织入的类字节码 | | -outjar | 输出 JAR 文件,包含增强后的类字节码 | | -aspectpath | 方面定义的路径 | | -sourcepath | 源代码的路径(用于生成调试信息) |

3.2 织入时机和范围

3.2.1 织入时机

Aspectjweaver 可以根据需要在不同的时间点进行字节码织入:

  • 编译时: 在 Java 编译器编译源代码时进行织入。
  • 加载时: 在 Java 虚拟机加载类字节码时进行织入。
  • 运行时: 在 Java 应用程序运行时进行织入。

3.2.2 织入范围

Aspectjweaver 可以对以下范围内的代码进行织入:

  • 类: 对整个类进行织入。
  • 方法: 对特定方法进行织入。
  • 代码块: 对特定代码块进行织入。

3.3 织入方式和配置

3.3.1 织入方式

Aspectjweaver 提供了两种主要的织入方式:

  • 基于注解: 使用 @AspectJ 注解标记需要织入的类或方法。
  • 基于 XML: 使用 XML 配置文件定义织入规则。

3.3.2 配置示例

基于注解示例:

@AspectJ
public class MyAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void beforeAdvice() {
        // 织入逻辑
    }
}

基于 XML 示例:

<aspectj>
    <weaver options="-showWeaveInfo">
        <include within="com.example.service..*">
            <advice type="before" within="*.*(..)">
                <target object="myAspect" method="beforeAdvice"/>
            </advice>
        </include>
    </weaver>
</aspectj>

3.3.3 织入过程图

下图展示了 Aspectjweaver 织入过程的简化流程图:

graph LR
subgraph Aspectjweaver
    compile --> load --> parse --> match --> generate --> output
end

4. AOP 框架间接口

4.1 Aopalliance-1.0.0.jar:AOP 标准接口

Aopalliance 是一个 Java AOP 框架的标准接口,它定义了 AOP 的核心概念和接口,为不同 AOP 框架之间的互操作性提供了基础。Aopalliance-1.0.0.jar 是 Aopalliance 标准的实现,它提供了以下核心接口:

  • Interceptor :AOP 拦截器接口,定义了 AOP 拦截器的方法签名,拦截器可以拦截方法调用并进行处理。
  • Joinpoint :连接点接口,表示方法调用或其他可拦截的事件。
  • Advice :通知接口,定义了在连接点周围执行的代码,例如前置通知、后置通知和异常通知。

4.2 Spring AOP 与 Aopalliance 的集成

Spring AOP 与 Aopalliance 集成,实现了 Aopalliance 标准接口,允许 Spring AOP 与其他 AOP 框架互操作。Spring AOP 提供了以下适配器类:

  • MethodBeforeAdviceAdapter :将 Spring AOP 的 MethodBeforeAdvice 适配为 Aopalliance 的 Interceptor
  • AfterReturningAdviceAdapter :将 Spring AOP 的 AfterReturningAdvice 适配为 Aopalliance 的 Interceptor
  • ThrowsAdviceAdapter :将 Spring AOP 的 ThrowsAdvice 适配为 Aopalliance 的 Interceptor

这些适配器类允许 Spring AOP 的通知与 Aopalliance 标准接口兼容,从而实现与其他 AOP 框架的互操作性。

代码示例

以下代码示例演示了如何使用 Spring AOP 和 Aopalliance 集成:

import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.NameMatchMethodPointcut;
import org.springframework.aop.support.StaticMethodMatcherPointcut;
import org.springframework.aop.target.SimpleTargetSource;
import org.aopalliance.intercept.MethodInterceptor;

public class AopallianceIntegrationExample {

    public static void main(String[] args) {
        // 创建目标对象
        TargetClass target = new TargetClass();

        // 创建切入点
        NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
        pointcut.addMethodName("methodA");

        // 创建拦截器
        MethodInterceptor interceptor = new MyMethodInterceptor();

        // 创建通知
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut, interceptor);

        // 创建代理工厂
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setTargetSource(new SimpleTargetSource(target));
        proxyFactory.addAdvisor(advisor);

        // 获取代理对象
        TargetClass proxy = (TargetClass) proxyFactory.getProxy();

        // 调用代理对象的方法
        proxy.methodA();
        proxy.methodB();
    }

    public static class TargetClass {

        public void methodA() {
            System.out.println("Executing methodA");
        }

        public void methodB() {
            System.out.println("Executing methodB");
        }
    }

    public static class MyMethodInterceptor implements MethodInterceptor {

        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("Before method invocation");
            Object result = invocation.proceed();
            System.out.println("After method invocation");
            return result;
        }
    }
}

代码逻辑分析

在这个代码示例中,我们创建了一个目标类 TargetClass ,并定义了两个方法 methodA methodB 。我们还创建了一个切入点 NameMatchMethodPointcut ,它匹配名为 methodA 的方法。

我们创建了一个拦截器 MyMethodInterceptor ,它实现了 Aopalliance 的 MethodInterceptor 接口。这个拦截器将在方法调用前后打印消息。

我们使用 DefaultPointcutAdvisor 将切入点和拦截器组合成一个通知。

我们使用 ProxyFactory 创建了一个代理工厂,并设置目标源和通知。

最后,我们获取代理对象并调用其方法。

当调用 methodA 时,拦截器将被调用,并打印消息。当调用 methodB 时,拦截器不会被调用,因为该方法不匹配切入点。

参数说明

  • NameMatchMethodPointcut.addMethodName(String) :添加要匹配的方法名。
  • DefaultPointcutAdvisor(Pointcut, Advice) :创建一个通知,其中包含切入点和通知。
  • ProxyFactory.setTargetSource(TargetSource) :设置代理对象的代理目标。
  • ProxyFactory.addAdvisor(Advisor) :添加通知到代理工厂。
  • ProxyFactory.getProxy() :获取代理对象。

5. Spring AOP 织入方式选择

Spring AOP 提供了多种织入方式,以满足不同的需求。本章节将介绍基于 XML、注解和 AspectJ 的织入方式,并分析其优缺点。

5.1 基于 XML 的织入

基于 XML 的织入是 Spring AOP 最早期的织入方式,它通过在 Spring 配置文件中定义 Aspect 和 Advisor 来实现。

优点:

  • 配置灵活,可以对织入行为进行精细控制。
  • 与 Spring 框架高度集成,配置简单。

缺点:

  • 配置冗长,特别是对于复杂场景。
  • 难以管理,随着代码量的增加,维护成本较高。

代码示例:

<aop:config>
  <aop:aspect ref="myAspect">
    <aop:pointcut id="myPointcut" expression="execution(* com.example.service.*.*(..))" />
    <aop:advice id="myAdvice" method="myAdviceMethod" pointcut-ref="myPointcut" />
  </aop:aspect>
</aop:config>

逻辑分析:

  • <aop:config> 定义 AOP 配置。
  • <aop:aspect> 定义 Aspect, ref 属性指定 Aspect bean 的名称。
  • <aop:pointcut> 定义 Pointcut, expression 属性指定切入点表达式。
  • <aop:advice> 定义 Advice, method 属性指定 Advice 方法, pointcut-ref 属性指定 Pointcut 的名称。

5.2 基于注解的织入

基于注解的织入通过在代码中使用注解来实现。Spring AOP 提供了 @Aspect @Pointcut @Advice 等注解。

优点:

  • 代码简洁,可读性强。
  • 与代码耦合度低,易于维护。

缺点:

  • 配置不够灵活,无法对织入行为进行精细控制。
  • 依赖于编译器支持,可能存在兼容性问题。

代码示例:

@Aspect
public class MyAspect {

  @Pointcut("execution(* com.example.service.*.*(..))")
  public void myPointcut() {}

  @Before("myPointcut()")
  public void myAdviceMethod() {}
}

逻辑分析:

  • @Aspect 注解定义 Aspect。
  • @Pointcut 注解定义 Pointcut, value 属性指定切入点表达式。
  • @Before 注解定义 Advice, value 属性指定 Pointcut 表达式。

5.3 基于 AspectJ 的织入

基于 AspectJ 的织入是 Spring AOP 最强大的织入方式,它利用 AspectJ 编译器对字节码进行增强。

优点:

  • 织入能力强大,支持复杂的切入点表达式和 Advice。
  • 与 AspectJ 框架高度集成,可以利用 AspectJ 的强大功能。

缺点:

  • 配置复杂,学习成本较高。
  • 依赖于 AspectJ 编译器,可能存在兼容性问题。

代码示例:

@Aspect
public class MyAspect {

  @Pointcut("execution(* com.example.service.*.*(..))")
  public void myPointcut() {}

  @Around("myPointcut()")
  public Object myAdviceMethod(ProceedingJoinPoint joinPoint) throws Throwable {
    // ...
  }
}

逻辑分析:

  • @Aspect 注解定义 Aspect。
  • @Pointcut 注解定义 Pointcut, value 属性指定切入点表达式。
  • @Around 注解定义 Advice, value 属性指定 Pointcut 表达式。
  • ProceedingJoinPoint 参数代表被织入的方法,可以控制方法的执行流程。

织入方式选择

不同的织入方式各有优缺点,选择合适的织入方式需要考虑以下因素:

  • 复杂性: 基于 XML 的织入最复杂,基于注解的织入其次,基于 AspectJ 的织入最简单。
  • 灵活性: 基于 XML 的织入最灵活,基于注解的织入其次,基于 AspectJ 的织入最不灵活。
  • 可维护性: 基于注解的织入最易维护,基于 XML 的织入其次,基于 AspectJ 的织入最难维护。
  • 兼容性: 基于注解的织入最兼容,基于 XML 的织入其次,基于 AspectJ 的织入最不兼容。

在实际应用中,通常会根据具体场景选择合适的织入方式。例如:

  • 对于简单的场景,基于注解的织入是一个不错的选择。
  • 对于需要精细控制织入行为的场景,基于 XML 的织入更合适。
  • 对于需要使用 AspectJ 强大功能的场景,基于 AspectJ 的织入是最佳选择。

6. Spring AOP 组件协作

Spring AOP 框架中,主要涉及以下几个组件:

6.1 BeanPostProcessor 和 Advisor

BeanPostProcessor 是 Spring 框架中用于在 bean 创建前后进行处理的接口。在 AOP 中,BeanPostProcessor 用于创建代理对象。

Advisor 是 AOP 中用于定义切面规则的接口。它包含一个 Pointcut 和一个 Advice。

6.2 Pointcut 和 Advice

Pointcut 用于定义切入点,即需要被代理的方法或类。它可以使用 AspectJ 表达式或 Spring 表达式语言 (SpEL) 来指定切入点。

Advice 用于定义在切入点执行时要执行的代码。它可以是前置通知、后置通知、环绕通知或异常通知。

6.3 ProxyFactoryBean 和 ProxyFactory

ProxyFactoryBean 是 Spring 框架中用于创建代理对象的工厂 bean。它使用 Advisor 来配置代理对象,并通过 BeanPostProcessor 机制在 bean 创建后创建代理对象。

ProxyFactory 是一个低级 API,用于直接创建代理对象。它可以用于更细粒度的代理控制。

代码示例:

@Aspect
public class LoggingAspect {

    @Pointcut("execution(* com.example.service.*.*(..))")
    public void loggingPointcut() {}

    @Before("loggingPointcut()")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before: " + joinPoint.getSignature().getName());
    }

    @After("loggingPointcut()")
    public void logAfter(JoinPoint joinPoint) {
        System.out.println("After: " + joinPoint.getSignature().getName());
    }
}

@SpringBootApplication
public class AopApplication {

    public static void main(String[] args) {
        SpringApplication.run(AopApplication.class, args);
    }
}

在该示例中, LoggingAspect 是一个切面类, loggingPointcut() 方法定义了切入点, logBefore() logAfter() 方法是通知,分别在切入点方法执行前和后执行。 AopApplication 是一个 Spring Boot 应用程序,用于启动 Spring 容器并创建代理对象。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Spring 框架在 AOP 方面提供了全面支持。本文将深入探讨 Spring AOP 使用的三个必备 JAR 包:aspectjrt.jar、aspectjweaver.jar 和 aopalliance-1.0.0.jar。我们将了解每个 JAR 包在 Spring AOP 中的角色,包括 AspectJ 运行时支持、字节码织入和 AOP 框架间的接口定义。通过理解这些基础组件,开发者可以更有效地使用 Spring AOP,编写解耦和模块化的代码。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
### 回答1: 使用Spring AOP需要依赖以下jar: 1. spring-aop: 核心AOP,提供了AOP的基本功能。 2. aspectjweaver: AspectJ是一个基于Java的面向切面编程框架,Spring AOP通过aspectjweaver与AspectJ集成。 3. spring-beans: 提供了Spring中的Bean管理功能。 4. spring-context: 提供了上下文(context)相关的功能,括对AOP的支持。 此外,你还需要引入Spring核心spring-core)和Spring上下文(spring-context),以支持Spring AOP的基本功能。 ### 回答2: 使用Spring AOP需要依赖以下几个核心的jar: 1. spring-core.jar:这是Spring框架的核心含了Spring中的基本功能和核心类。 2. spring-aop.jar:这个jar含了Spring AOP模块的实现代码。 3. spring-beans.jar:这个jar含了Spring中的Bean的相关功能和类。 4. aspectjrt.jar:这是AspectJ的运行时库,Spring AOP实际上是对AspectJ AOP实现的封装,因此需要使用AspectJ的运行时库。 5. aspectjweaver.jar:这是AspectJ的织入器,用于在运行时将切面织入到目标对象中。 除了以上核心的jar外,还可能需要依赖其他的jar,具体情况取决于你在使用Spring AOP时用到的功能和组件。例如,如果你使用了Spring的事务管理功能,可能还需要依赖spring-tx.jar;如果你使用了Spring的注解功能,可能还需要依赖spring-context.jar等。 总之,使用Spring AOP需要依赖的jar主要spring-core.jarspring-aop.jarspring-beans.jar、aspectjrt.jar和aspectjweaver.jar,同时还可能需要依赖其他的相关jar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值