【AOP入门案例深解析】

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【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”,并输出当前时间戳。


相关文章
|
1月前
|
数据采集 人工智能 安全
数据治理的实践与挑战:大型案例解析
在当今数字化时代,数据已成为企业运营和决策的核心资源。然而,随着数据量的爆炸性增长和数据来源的多样化,数据治理成为了企业面临的重要挑战之一。本文将通过几个大型案例,探讨数据治理的实践、成效以及面临的挑战。
数据治理的实践与挑战:大型案例解析
|
12天前
|
存储 人工智能 自然语言处理
高效档案管理案例介绍:文档内容批量结构化解决方案解析
档案文件内容丰富多样,传统人工管理耗时低效。思通数科AI平台通过自动布局分析、段落与标题检测、表格结构识别、嵌套内容还原及元数据生成等功能,实现档案的高精度分块处理和结构化存储,大幅提升管理和检索效率。某历史档案馆通过该平台完成了500万页档案的数字化,信息检索效率提升60%。
|
21天前
|
Prometheus 监控 Cloud Native
实战经验:成功的DevOps实施案例解析
实战经验:成功的DevOps实施案例解析
36 6
|
21天前
|
存储 弹性计算 NoSQL
"从入门到实践,全方位解析云服务器ECS的秘密——手把手教你轻松驾驭阿里云的强大计算力!"
【10月更文挑战第23天】云服务器ECS(Elastic Compute Service)是阿里云提供的基础云计算服务,允许用户在云端租用和管理虚拟服务器。ECS具有弹性伸缩、按需付费、简单易用等特点,适用于网站托管、数据库部署、大数据分析等多种场景。本文介绍ECS的基本概念、使用场景及快速上手指南。
62 3
|
24天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
16 1
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
前端大模型入门(三):编码(Tokenizer)和嵌入(Embedding)解析 - llm的输入
本文介绍了大规模语言模型(LLM)中的两个核心概念:Tokenizer和Embedding。Tokenizer将文本转换为模型可处理的数字ID,而Embedding则将这些ID转化为能捕捉语义关系的稠密向量。文章通过具体示例和代码展示了两者的实现方法,帮助读者理解其基本原理和应用场景。
190 1
|
1月前
|
数据格式
常用的Lambda表达式案例解析,工作中都会用到!
常用的Lambda表达式案例解析,工作中都会用到!
|
1月前
|
JSON JavaScript 前端开发
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
83 0
|
1月前
|
存储 数据采集 监控
CDGA\如何建立实现数据治理的效率价值框架:实践案例解析
数据治理是一个持续优化的过程。组织应建立健全的监督与评估机制,定期对数据治理工作进行评估,发现问题及时整改。广东药科大学通过数据全景图和数据监控大屏,实现了对数据治理成果的动态、多维度呈现与监控,为科学管理决策提供了有力支撑。
|
4天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2

推荐镜像

更多