【AOP入门案例深解析】

news2024/12/24 9:34:37

AOP

封面

sa

1.AOP简介

AOP(Aspect Oriented Programming)面向切面编程,是一种编程范式,指导开发者如何组织程序结构
OOP(Object Oriented Programming)面向对象编程
作用:在步惊动原始设计的基础上进行功能增强,追加功能
Spring理念:无侵入式

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”,并输出当前时间戳。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1579505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二证券|“元素周期表”行情延续 资源股牛市引发激辩

4月8日,以黄金等贵金属、铜等工业金属为首的周期板块继续狂飙。无论是现货,仍是商品期货,抑或是股票商场的资源股,价格均在继续扬升。赛道股和周期股的“跷跷板”效应接连,医药、光伏、芯片等板块普跌。 截至收盘&…

统信UOS系统初识--研发岗

第一步 获取root权限 配置环境等都需要用到root权限,所以我们先获取到root权限,方便下面的操作 下载软件 在UOS应用商店下载的所需应用 版本都比较低 安装node 官网下载了【arm64】的包,解压到指定文件夹,设置链接&#xff0…

Codeforces Round 938 (Div. 3) (A~E)

Codeforces Round 938 (Div. 3) (A~E) 目录:A B C D E A题:Yogurt Sale 标签: 数学(math) 题目大意 酸奶价格, a 元一份,b元两份n问:买n份最少多少钱 思路 a元一份,b元两份&#…

css实现各级标题自动编号

本文在博客同步发布,您也可以在这里看到最新的文章 Markdown编辑器大多不会提供分级标题的自动编号功能,但我们可以通过简单的css样式设置实现。 本文介绍了使用css实现各级标题自动编号的方法,本方法同样适用于typora编辑器和wordpress主题…

【C++】C++11可变参数模板

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 可变参数模板的定义…

简化您的实验室:用于样品瓶库存跟踪的高级批量扫描

在实验室工作需要精确和高效。跟踪小瓶库存至关重要但很耗时。忘记手动扫描并使用 Dynamsoft Barcode Reader进行自动批量扫描。 点击下载Dynamsoft最新版https://www.evget.com/product/3691/download 具有批量扫描功能的管式和架式扫描仪 批量扫描在扫描托盘上的小瓶时特别…

微信小程序自定义tabbar,页面切换存在闪动【解决方案】

需求: 自定义tabbar,在需要的几个主页面都加入这么一个组件,但是有个情况;而组件中使用照片(svg或png)和文字;在切换tabbar的时候,跳转相应的页面,运行到真机或是模拟器,…

中国国家博物馆古代钱币展

第一部分,以时间为线介绍四次变革 贝壳 春秋战国:刀币布币圆钱。从春秋时期进入金属铸币阶段到战国时期已确立布币,刀币,蚁鼻钱,环钱四大货币体系。 秦:圆形方孔(直到清末机器铸钱变为无孔&a…

上海晶珩树莓派工业智能机械臂,亮相2024年embedded world博览会!

上海晶珩树莓派工业智能机械臂,亮相2024年embedded world博览会! 工业智能机械臂是上海晶珩(EDATEC)团队基于树莓派工业相机ED-AIC2000和树莓派工业触摸屏ED-HMI2320开发的创新应用案例。 工业智能机械臂具备卓越的定位能力&…

【CVE复现计划】CVE-2024-0195

CVE-2024-0195 简介: SpiderFlow是新一代开源爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。基于springbootlayui开发的前后端不分离,也可以进行二次开发。该系统/function/save接口存在RCE漏洞,攻击者可以构造恶意命…

最简单知识点PyTorch中的nn.Linear(1, 1)

一、nn.Linear(1, 1) nn.Linear(1, 1) 是 PyTorch 中的一个线性层(全连接层)的定义。 nn 是 PyTorch 的神经网络模块(torch.nn)的常用缩写。 nn.Linear(1, 1) 的含义如下: 第一个参数 1:输入特征的数量…

爬虫入门教程(一)

爬虫入门教程 1.什么是爬虫 爬虫是一种自动获取网站数据的程序或脚本。它可以自动模拟人类访问网站,获取网页源代码,解析并提取出所需的数据。 爬虫的工作原理类似于搜索引擎的索引程序,它们会按照预定的规则和算法在互联网上不断地爬取网页,收集信息…

蓝桥杯 交通信号 2022研究生组

问题: Dijstra算法变形题,有向边分正行和逆行方向,注意逆行的绿灯时间是正行的红灯时间。 这题的关键是理清从当前节点出发,到下一个节点是哪一时刻,理清这一点后,再跑Dijstra算法求最短路。 假设curr_t时…

STC89C52学习笔记(三)

STC89C52学习笔记(三) 综述:本文讲述了通过51单片机控制LED闪烁、流水灯、按键控制LED亮灭、按键控制LED实现二进制、按键控制LED左右移。 一、LED 1.LED闪烁 1)LED电路原理 LED采用共阳极,当LED另一端为低电平时…

【CSDN活动】人工智能:前沿科技中的创业机遇与挑战

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 人工智能:前沿科技中的创业机遇与挑战一、AI技术的快速发展与应用拓…

KaiwuDB 乱序数据处理功能解读

01 背景一览 在时序数据写入数据库的场景中,由于存在网络延迟等问题,可能会出现需要写入数据的时间戳小于已写入数据的最大时间戳的情况,这类数据统称为乱序数据。乱序数据的产生几乎是不可避免的,同时,乱序数据的写入…

从概念到实践:揭开枚举与联合体在数字化创新时代的神秘面纱

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 在编程的世界中,枚举和联合体是两种非常基础且重要的数据结构。它们各自具有独特的特点和用途,为程序员提供…

Android Studio中查看和修改project的编译jdk版本

android studio中查看和修改project的编译jdk版本操作如下: File->settings->Build,Execution,deployment->Build Tools->Gradles 进入Gradles页面可以查看并修改project的编译jdk版本,如图所示

Open CASCADE学习|平面上的PCurve

曲面上的曲线PCurve,字面上理解即为参数曲线(Parametric Curve)。在几何建模中,PCurve通常被描述为附加在参数曲面之间公共边上的数据结构。从更具体的定义来看,当给定一个曲面方程,并且其参数u和v是另一个参数t的函数时&#xff…

企业微信认证后可以修改主体吗?

企业微信变更主体有什么作用?如果原有的公司注销了,或者要更换一家公司主体来运营企业微信,那么就可以进行变更主体,变更主体后才可以保留原来企业微信上的所有用户,否则就只能重新申请重新积累用户了。企业微信变更主…