聊聊Spring——AOP详解(AOP概览)

我来详细讲解一下 "聊聊Spring——AOP详解(AOP概览)" 这篇文章的完整攻略。

什么是AOP

AOP(Aspect-Oriented Programming)是一种编程思想,它通过将横切关注点(Cross-cutting Concern)从主业务逻辑中分离出来,将其封装为一种独立的模块化方式,从而使程序结构更加清晰,维护更加方便。

AOP的术语

Join Point

Join Point(连接点)是指程序执行过程中的一个特定点,比如方法调用、异常抛出等。

Pointcut

Pointcut(切点)是指我们对哪些 Join Point 感兴趣,通常是通过表达式的方式指定。

Advice

Advice(通知)是指在切点上执行的代码,有 Before、After、Around、Throws 等多种类型。

Aspect

Aspect(切面)是切点和通知的组合体。

AOP的实现方式

经典的 AOP 实现方式有两种

基于动态代理的实现方式

Java JDK 提供了动态代理机制来实现 AOP,也可以使用第三方 JDK 动态代理库,比如 CGLIB。

代码示例:

public interface IUserService {
    public void addUser(String username, String password);
}

public class UserServiceImpl implements IUserService{
    public void addUser(String username, String password) {
        System.out.println("添加用户 " + username + "|" + password);
    }
}

public class LogInterceptor implements InvocationHandler {
    private Object target;

    public LogInterceptor(Object target) {
        this.target = target;
    }

    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;
    }
}

public class Client {
    public static void main(String[] args) {
        IUserService userService = new UserServiceImpl();
        InvocationHandler handler = new LogInterceptor(userService);
        IUserService proxy = (IUserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), handler);
        proxy.addUser("lucy", "123456");
    }
}

基于字节码增强的实现方式

基于字节码增强的 AOP 实现方式,就是通过修改类的字节码,来实现切面逻辑。目前比较流行的字节码框架是 AspectJ。

代码示例:

public aspect LogAspect {
    pointcut addUser(String username, String password) : execution(* addUser(String, String)) && args(username, password);

    before(String username, String password) : addUser(username, password) {
        System.out.println("开始记录日志");
    }

    after(String username, String password) : addUser(username, password) {
        System.out.println("结束记录日志");
    }
}

public interface IUserService {
    public void addUser(String username, String password);
}

public class UserServiceImpl implements IUserService{
    public void addUser(String username, String password) {
        System.out.println("添加用户 " + username + "|" + password);
    }
}

public class Client {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        IUserService userService = (IUserService) ctx.getBean("userService");
        userService.addUser("lucy", "123456");
    }
}

总结

AOP 是一种非常重要的编程思想,可以让我们将公共代码模块化、解耦,从而提高程序的可维护性和可重用性。AOP 的实现方式有两种,基于动态代理的方式和基于字节码增强的方式。我们需要根据具体应用场景,选择合适的实现方式。

以上就是关于 "聊聊Spring——AOP详解(AOP概览)" 的完整攻略。

另外,我再来举一些示例:

示例1:使用AOP实现日志记录

@Component
@Aspect
public class LogAspect {

    @Pointcut("execution(public * com.example.demo.controller..*.*(..))")
    public void webLog() {
    }

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) {
       // 处理日志记录逻辑
    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理日志记录逻辑
    }
}

示例2:使用AOP实现事务管理

@Component
@Aspect
public class TransactionAspect {

    @Pointcut("@annotation(com.example.demo.anno.Tranctional)")
    public void tranction() {
    }

    @Before("tranction()")
    public void doBefore(JoinPoint joinPoint) {
        // 开启数据库事务
    }

    @AfterReturning("tranction()")
    public void doAfterReturning(JoinPoint joinPoint) {
        // 提交数据库事务
    }

    @AfterThrowing("tranction()")
    public void doAfterThrowing(JoinPoint joinPoint) {
        // 回滚数据库事务
    }
}

以上就是两个使用AOP的示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:聊聊Spring——AOP详解(AOP概览) - Python技术站

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

相关文章

  • JDK1.6集合框架bug 6260652解析

    JDK1.6集合框架bug 6260652解析 问题描述 JDK1.6版本的集合框架中存在一个bug,编号为6260652。该问题存在于java.util.HashMap和java.util.HashSet等集合类中的迭代器实现中。当在迭代过程中,同时修改集合中的元素,或更改元素hashCode值导致迭代器自动校验失败时,就会引发ConcurrentModi…

    Java 2023年5月27日
    00
  • 教你怎么用java一键自动生成数据库文档

    下面我将详细讲解怎么用 Java 一键自动生成数据库文档的完整攻略,过程中将会包含两条示例。 1. 确定使用的工具 首先需要选择自动生成数据库文档的工具,推荐使用 DDLDoc 。 DDLDoc 是一个使用 Java 开发的工具,可以将数据库的表结构导出成 html 格式的文档,同时也支持 PDF 格式的导出。 2. 安装和配置DDLDoc 下载 DDLDo…

    Java 2023年5月19日
    00
  • Spring Security中使用authorizeRequests遇到的问题小结

    (注:以下是针对题目中“Spring Security中使用authorizeRequests遇到的问题小结”的完整攻略) 问题描述 在使用Spring Security过程中,我们可能会使用到 .authorizeRequests() 方法,它用于配置访问控制,但在配置过程中可能会出现一些问题。 问题分析 常见的 .authorizeRequests() …

    Java 2023年5月20日
    00
  • Java8排序stream.sorted()的使用

    当我们需要对一个List或数组等集合进行排序时,我们可以使用Java8中的Stream.sorted()方法进行排序。下面就详细讲解一下Java8排序Stream.sorted()的使用攻略。 一、Stream的sorted()方法 Stream.sorted()方法是一个中间操作,它返回一个排序好的流,可以对元素进行自然排序或指定Ordering排序。 下…

    Java 2023年5月26日
    00
  • Hibernate持久化对象生命周期原理解析

    Hibernate持久化对象生命周期原理解析——完整攻略 什么是Hibernate? Hibernate是一个Java持久化框架,可以将Java程序中的对象映射到关系型数据库中,使得程序员可以直接操作Java对象,而无需写SQL语句。 Hibernate中的对象生命周期 Hibernate中的对象生命周期分为四个状态:瞬时状态、持久化状态、游离状态、删除状态…

    Java 2023年5月19日
    00
  • 实例讲解使用Spring通过JPA连接到Db2

    接下来我会为你详细讲解“实例讲解使用Spring通过JPA连接到Db2”的完整攻略。 前置要求 在开始之前,你需要先满足以下要求: 确保你已经安装好了Java开发环境和Maven构建工具。 确保你已经安装好了Db2数据库,并且已经创建好了相应的数据库和表。 确保你已经对Spring框架有一定的了解,包括Spring Boot、Spring Data JPA等…

    Java 2023年5月20日
    00
  • 使用SpringBoot配置https(SSL证书)

    使用 Spring Boot 配置 HTTPS (SSL 证书) 的完整攻略 在本文中,我们将详细介绍如何使用 Spring Boot 配置 HTTPS (SSL 证书)。我们将介绍 HTTPS 的概念、配置方式和提供两个示例。 HTTPS 概念 HTTPS (Hyper Text Transfer Protocol Secure) 是一种通过 SSL/TL…

    Java 2023年5月15日
    00
  • 浅析JSP的9大内置对象和4大作用域对象

    浅析JSP的9大内置对象和4大作用域对象 JSP(JavaServer Pages)是一种基于Java语言,用于创建动态web页面的技术。当客户端请求JSP页面时,Tomcat服务器会解析JSP页面,将其中的Java代码转化为标准的Servlet,并执行Servlet,最后将生成的HTML页面返回给客户端。 在JSP页面中,有9大内置对象和4大作用域对象,这…

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