【AOP入门案例深解析】

简介: 【AOP入门案例深解析】

AOP

1.AOP简介

2.AOP核心概念

- 2.1连接点

(JoinPoint):程序执行过程中的任意位置,粒度为执行方法,抛出异常,设置变量等

在SpringAOP中,理解为方法的执行

切入点(Pointcut):匹配连接点的式子

在SpringAop中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

- 2.2一个具体方法

一个具体方法:com.hcx.dao包下的BookDao接口中的无形参返回值的save方法

匹配多个方法,所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法

-2.3 - 通知(Advice)

通知(Advice):在切入点处执行的操作,也就是共性功能

在Spring中,功能最终以方法的形式呈现

-2.4 通知类

通知类:定义通知的类

切面(Aspect):描述通知与切入点的对应关系

3.AOP注解开发版

3.1

package com.shangyacong.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

@Configuration
@ComponentScan("com.shangyacong")
@EnableAspectJAutoProxy//表示注解开发AOP
public class SpringConfig {
}

这个是AOP的SpringConfig配置类

@Configuration注解表示这是一个配置类

@ComponentScan(“com.shangyacong”)表示要扫描com.shangyacong下的包

@EnableAspectJAutoProxy表示用注解开发AOP使其能进入aop包下的通知类能扫描他并生成bean

3.2

package com.shangyacong.dao;

import org.springframework.stereotype.Component;


public interface BookDao {
    public void save();
    public void select();
}

这是一个接口里面有两个方法再继承接口时必须实现方法

3.3

package com.shangyacong.dao;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao{

    public void save(){
        System.out.println(System.currentTimeMillis());
        System.out.println("book dao save...");

    }

    public void select() {
        System.out.println("book dao select...");
    }

}

这是一个实现类并继承了一个BookDao的接口里面重写了接口的方法

3.4

package com.shangyacong;

import com.shangyacong.config.SpringConfig;
import com.shangyacong.dao.BookDaoImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.shangyacong.dao.BookDao;

public class APP {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao=  applicationContext.getBean(BookDao.class);
        bookDao.select();
    }
}

    ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class);

这行代码时获取配置文件

BookDao BookDao= applicationContext.getBean(BookDao.class);这行是从IOC容器中获取BookDao类型的Bean

下面是调用select方法

我们可以看到在select方法中什么都没有,只有一句打印

3.5

package com.shangyacong.aop;


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

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.shangyacong.dao..select())")
    private void pt(){}
    @Around("pt()")
    public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("before advice");
        Object object= proceedingJoinPoint.proceed();
        System.out.println(System.currentTimeMillis());
        System.out.println("after advice");
        return object;
    }
}

以上代码是一个基本的 Spring AOP 切面的实现示例:

  1. @Component 注解标识该类为 Spring 组件,它会被 Spring 扫描并纳入到 Spring 容器中管理。
  2. @Aspect 注解标识该类为切面类,告诉 Spring 它包含切点和通知。
  3. MyAdvice 类定义了一个切面,其中包含了一个切点和一个环绕通知。
  4. @Pointcut 注解定义了一个切点,该切点匹配了 com.shangyacong.dao 包下的所有 select() 方法的执行。这里使用了 AspectJ 的切点表达式语法来定义切点。
  5. Around 方法标记了一个环绕通知,它会在切点匹配的方法执行前后执行。
  6. Around 方法中,首先输出 “before advice”,表示在目标方法执行前执行的逻辑。
  7. proceedingJoinPoint.proceed() 调用了目标方法的执行,实际上启动了目标方法的执行过程。
  8. Object object= proceedingJoinPoint.proceed(); 语句执行目标方法,并将返回值保存在 object 变量中。
  9. 在目标方法执行完成后,输出当前时间戳(System.currentTimeMillis())和 “after advice”,表示在目标方法执行后执行的逻辑。
  10. 最后,返回目标方法的执行结果。

这段代码通过切面 MyAdvice 定义了一个环绕通知,该通知会在匹配的目标方法执行前后分别输出 “before advice” 和 “after advice”,并输出当前时间戳。


相关文章
|
3月前
|
开发框架 .NET 中间件
.net8 使用 license 证书授权案例解析
本文介绍了如何使用 `.NET CLI` 创建并改造一个 `ASP.NET Core Web API` 项目,以实现基于许可证的授权机制。具体步骤包括创建项目、添加必要的 NuGet 包(如 `Standard.Licensing` 和 `Swashbuckle.AspNetCore`),以及修改 `Program.cs` 文件以集成自定义的许可证验证中间件。项目结构中新增了 `LicenseController` 接口用于处理授权相关操作,并通过测试流程验证了默认天气接口在未授权和授权状态下的响应情况。整个过程确保了应用程序能够在启动时正确验证许可证,保障系统的安全性与可控性。
139 9
.net8 使用 license 证书授权案例解析
|
3月前
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生<audio>标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
124 12
|
3月前
|
机器学习/深度学习 人工智能 搜索推荐
技术革新下的培训新趋势:案例解析
从最初的“试试看”,到如今的“非做不可”,企业培训已经成为央国企和上市公司不可或缺的战略环节。无论是AI与大模型的赋能,DeepSeek,还是具身智能、智算技术和数据科学的实战应用,这些课程都在为企业打开新的可能性。
|
3月前
|
Java 关系型数据库 数据库连接
Javaweb之Mybatis入门程序的详细解析
本文详细介绍了一个MyBatis入门程序的创建过程,从环境准备、Maven项目创建、MyBatis配置、实体类和Mapper接口的定义,到工具类和测试类的编写。通过这个示例,读者可以了解MyBatis的基本使用方法,并在实际项目中应用这些知识。
109 11
|
4月前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
4月前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
3月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
2月前
|
人工智能 监控 Java
面向切面编程(AOP)介绍--这是我见过最易理解的文章
这是我见过的最容易理解的文章,由浅入深介绍AOP面向切面编程,用科普版和专家版分别解说,有概念,有代码,有总结。
|
9月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
190 1
|
7月前
|
安全 Java 编译器
什么是AOP面向切面编程?怎么简单理解?
本文介绍了面向切面编程(AOP)的基本概念和原理,解释了如何通过分离横切关注点(如日志、事务管理等)来增强代码的模块化和可维护性。AOP的核心概念包括切面、连接点、切入点、通知和织入。文章还提供了一个使用Spring AOP的简单示例,展示了如何定义和应用切面。
995 1
什么是AOP面向切面编程?怎么简单理解?

推荐镜像

更多
  • DNS