Spring开发核心之AOP的实现与切入点持久化

Spring开发核心之AOP的实现与切入点持久化

什么是AOP

将一个大的功能划分为小的功能单元,然后将这些小的功能进行组合,就构成了一个完整的大功能。在划分功能单元的时候,要考虑到它们的通用性。这种技术称为模块化设计,也称为面向切面编程(AOP)

AOP的实现

Spring中AOP的实现主要是通过动态代理的方式来实现的。Spring可以为普通的类以及接口生成动态代理,以增强类的功能。

代理样例

以下面代码为例:

package com.example.demo;

public interface TestService {
    void doSomething();
}

完成代理:

package com.example.demo;

public class TestServiceProxy implements InvocationHandler {
    private Object target;

    public Object bind(Object target) {
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), 
                                      target.getClass().getInterfaces(),
                                      this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法执行前");
        Object result = method.invoke(target, args);
        System.out.println("方法执行后");
        return result;
    }
}

在这个代理中,我们使用了代理对象和被代理的原始对象。利用这种方式,增强了原始对象的功能。

Spring AOP实现

Spring中使用AOP代理主要有两种方式:

  1. 基于proxy:使用JDK自带的Proxy类实现代理,这种方式只能代理接口,不能代理类;
  2. 基于aspect:基于Aspectj框架实现织入,可以代理接口和类。

使用proxy示例:

在Spring AOP中,我们可以通过实现Interceptor接口来实现增强方法,Interceptor有两个主要的执行方法——preHandle和afterCompletion。

假设我们有一个类:

@Service
public class TestService {
    public void doSomething() {
        System.out.println("do something!");
    }
}

为这个类添加一个拦截器:

@Aspect
@Component
public class TestAspect {
    @Pointcut("execution(* com.example.demo.TestService.*(..))")
    public void testMethod() {}

    @Before("testMethod()")
    public void doBefore() {
        System.out.println("方法执行前...");
    }

    @After("testMethod()")
    public void doAfter() {
        System.out.println("方法执行后...");
    }
}

在这个例子中,我们使用了@Aspect和@Pointcut两个注解。@Aspect表示这个类为切面类,@Pointcut表示定义一个切入点,拦截TestService类的所有方法。

使用aspect示例:

定义切面类:

@Aspect
@Component
public class AspectTest {
    @Pointcut("execution(* com.example.demo.Test.*(..))")
    public void testMethod() {}

    @Around("testMethod()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("方法执行前...");
        Object result = pjp.proceed();
        System.out.println("方法执行后...");
        return result;
    }
}

当我们使用基于aspect的方式时,我们需要定义切面类,并且使用@Aspect注解,@Pointcut注解定义需要织入的切入点,@Around注解则定义需要增强的方法。

AOP切入点持久化

在AOP中,我们经常需要使用切入点。但是,如果我们有多个切面类,而切入点又是一样的,这就会带来不必要的重复工作。所以,我们可以将一些切入点持久化,方便以后的使用。

Spring提供了两种方式来实现切入点的持久化:使用@Aspect标记或是在XML配置文件中进行定义。

@Aspect标记

  1. 定义切面接口:
package com.example.demo.advice;

public interface ICommonAdvice {
}
  1. 定义基础切面类,需要实现切面接口:
package com.example.demo.advice;

@Aspect
@Component
public abstract class BasicAdvice implements ICommonAdvice {
}

使用@Aspect标记这个类,加上@Component注解,表示这是一个切面类,并且需要实现切面接口。

  1. 在子切面类中继承并声明切入点:
package com.example.demo.advice;

@Aspect
@Component
public class TestAdvice extends BasicAdvice {
    @Pointcut("execution(* com.example.demo.Test.*(..))")
    public void testMethod() {}

    @Around("testMethod()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("方法执行前...");
        Object result = pjp.proceed();
        System.out.println("方法执行后...");
        return result;
    }
}

在子切面类中,我们可以继承父切面类,并声明自己的切入点。

XML配置

在XML配置文件中进行定义

  1. 在XML配置文件中引入AOP的命名空间
<bean xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
  1. 定义切入点:
<aop:pointcut expression="execution(* com.example.demo.Test.*(..))" id="testMethod" />
  1. 定义增强方法:
<aop:aspect ref="testAspect">
    <aop:around method="doAround" pointcut-ref="testMethod" />
</aop:aspect>

在这个例子中,我们定义了一个切入点,拦截Test类的所有方法。同时,我们定义了在Test类中应用切面的类TestAspect。我们使用标签来为 Test 添加增强方法doAround。

总结

本文介绍了AOP的实现方式及切入点的持久化方式。AOP实现主要基于动态代理,Spring中实现AOP一般有两种方式:使用@Aspect标记或是在XML文件中进行定义。切入点的持久化可以避免重复定义相同的切入点,减轻工作量,提高效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring开发核心之AOP的实现与切入点持久化 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解Spring Boot 使用Spring security 集成CAS

    下面是“详解Spring Boot 使用Spring security 集成CAS”的完整攻略。 1. 什么是CAS CAS(Central Authentication Service)是企业级的单点登录解决方案,可以为多个客户端提供统一的认证和授权管理服务。它使用了流行的Web认证的协议,如OAuth、OpenID等,同时可以整合LDAP等现有认证机制。…

    Java 2023年5月20日
    00
  • SpringBoot项目开发常用技术整合

    Spring Boot项目开发常用技术整合 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、便捷的方式来创建基于Spring的应用程序,同时也提供了一些默认的和约定,使得开发人员可以更加专注于业务逻辑的实现。本文将详细讲解如何使用Spring Boot整合常用技术,并提供两个示例。 1. 整合MyBatis MyB…

    Java 2023年5月15日
    00
  • Spring Mvc中传递参数方法之url/requestMapping详解

    Spring MVC中传递参数方法之URL/RequestMapping详解 在Spring MVC中,我们可以通过URL和RequestMapping来传递参数。本文将详细介绍Spring MVC中传递参数的方法,并提供两个示例说明。 URL传递参数 在Spring MVC中,我们可以通过URL来传递参数。以下是一个简单的URL传递参数示例,它将参数id传…

    Java 2023年5月17日
    00
  • Java switch关键字原理及用法详解

    Java switch关键字原理及用法详解 1. 概述 switch 是 Java 中的一个关键字,用于基于不同的条件执行不同的操作。它是一种比较简单却又很实用的控制语句,它包含一个或多个 case 模块,每个模块代表一个条件,当条件满足时执行相应的代码。 2. 语法结构 switch 控制语句的语法结构如下: switch (expression) { c…

    Java 2023年5月27日
    00
  • SpringBoot统一返回JSON格式实现方法详解

    根据你给出的主题,我将为你提供一个完整的 Spring Boot 统一返回 JSON 格式的实现方法攻略。 什么是 Spring Boot 统一返回 JSON 格式 Spring Boot 是一种基于 Spring 框架的轻量级应用程序开发框架,它可以非常快速地构建 Web 应用程序和 RESTful 服务。随着 RESTful 服务的流行,Spring B…

    Java 2023年5月20日
    00
  • win10怎么安装java?win10系统安装java的方法

    下面是安装 Java 的完整攻略。 准备工作 在开始安装 Java 之前,需要确认你的计算机上尚未安装 Java 环境,可以通过以下方式检查: 打开命令行窗口,输入命令 java -version,如果显示类似 “java version 1.8.0_241” 的信息,则表示已安装 Java 环境; 如果没有显示版本信息,或提示未找到 java 命令,则需要…

    Java 2023年5月24日
    00
  • windows系统配置Java开发环境变量

    下面我将详细讲解在Windows系统上配置Java开发环境变量的完整攻略,包括以下内容: 下载Java JDK 安装Java JDK 配置Java环境变量 验证Java环境变量是否配置成功 下载Java JDK 首先,我们需要从Oracle官网(https://www.oracle.com/java/technologies/javase-downloads…

    Java 2023年5月24日
    00
  • 你肯定能看懂的Java IO相关知识总结

    下面是详细的总结攻略。 Java IO 简介 Java IO(输入/输出) 是非常重要的一部分,在日常开发中我们经常需要读取文件或者网络数据。Java IO 可以帮助我们进行文件的读写、网络通讯等操作。我们可以通过 File、InputStream、OutputStream、Reader、Writer 等类来对IO进行操作。 Java IO 相关知识总结 下…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部