首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Spring教程14】Spring框架实战:AOP入门案例实战详解

  • 24-03-05 07:20
  • 4625
  • 12708
blog.csdn.net

目录

  • 1 需求分析
  • 2 思路分析
  • 3 环境准备
  • 4 AOP实现步骤
  • 5 知识总结

欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 深入详解什么是AOP》

在这里插入图片描述

1 需求分析

案例设定:测算接口执行效率,但是这个案例稍微复杂了点,我们对其进行简化。
简化设定:在方法执行前输出当前系统时间。
对于SpringAOP的开发有两种方式,XML 和 注解,我们使用哪个呢?
因为现在注解使用的比较多,所以本次课程就采用注解完成AOP的开发。
总结需求为:使用SpringAOP的注解方式完成在方法执行的前打印出当前系统时间。

2 思路分析

需求明确后,具体该如何实现,都有哪些步骤,我们先来分析下:

1.导入坐标(pom.xml)
2.制作连接点(原始操作,Dao接口与实现类)
3.制作共性功能(通知类与通知)
4.定义切入点
5.绑定切入点与通知关系(切面)

3 环境准备

  • 创建一个Maven项目
  • pom.xml添加Spring依赖
<dependencies>
	<dependency>
		<groupId>org.springframeworkgroupId>
		<artifactId>spring-contextartifactId>
		<version>5.2.10.RELEASEversion>
	dependency>
dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 添加BookDao和BookDaoImpl类
public interface BookDao {
	public void save();
	public void update();
}

@Repository
public class BookDaoImpl implements BookDao {

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

	public void update(){
		System.out.println("book dao update ...");
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 创建Spring的配置类
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
}
  • 1
  • 2
  • 3
  • 4
  • 编写App运行类
public class App {
public static void main(String[] args) {
	ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
		BookDao bookDao = ctx.getBean(BookDao.class);
		bookDao.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

最终创建好的项目结构如下:
在这里插入图片描述
说明:

  • 目前打印save方法的时候,因为方法中有打印系统时间,所以运行的时候是可以看到系统时间
  • 对于update方法来说,就没有该功能
  • 我们要使用SpringAOP的方式在不改变update方法的前提下让其具有打印系统时间的功能。

4 AOP实现步骤

  • 步骤1:添加依赖
    pom.xml
<dependency>
	<groupId>org.aspectjgroupId>
	<artifactId>aspectjweaverartifactId>
	<version>1.9.4version>
dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

  • 因为spring-context中已经导入了spring-aop ,所以不需要再单独导入spring-aop
  • 导入AspectJ的jar包,AspectJ是AOP思想的一个具体实现,Spring有自己的AOP实现,但是相比于AspectJ来说比较麻烦,所以我们直接采用Spring整合ApsectJ的方式进行AOP开发。

步骤2:定义接口与实现类

环境准备的时候,BookDaoImpl已经准备好,不需要做任何修改

步骤3:定义通知类和通知

通知就是将共性功能抽取出来后形成的方法,共性功能指的就是当前系统时间的打印。

public class MyAdvice {
	public void method(){
		System.out.println(System.currentTimeMillis());
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5

类名和方法名没有要求,可以任意。

步骤4:定义切入点
BookDaoImpl中有两个方法,分别是save和update,我们要增强的是update方法,该如何定义呢?

public class MyAdvice {
	@Pointcut("execution(void com.itheima.dao.BookDao.update())")
		private void pt(){}
		public void method(){
		System.out.println(System.currentTimeMillis());
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

说明:
切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。
execution及后面编写的内容,后面会有章节专门去学习。

public class MyAdvice {
	@Pointcut("execution(void com.itheima.dao.BookDao.update())")
	private void pt(){}
	@Before("pt()")
	public void method(){
		System.out.println(System.currentTimeMillis());
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置
在这里插入图片描述
说明:@Before翻译过来是之前,也就是说通知会在切入点方法执行之前执行,除此之前还有其他四种类型,后面会讲。

步骤6:将通知类配给容器并标识其为切面类

@Component
@Aspect
public class MyAdvice {
	@Pointcut("execution(void com.itheima.dao.BookDao.update())")
		private void pt(){}
		@Before("pt()")
		public void method(){
		System.out.println(System.currentTimeMillis());
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

步骤7:开启注解格式AOP功能

@Configuration
@ComponentScan("com.itheima")
@EnableAspectJAutoProxy
public class SpringConfig {
}
  • 1
  • 2
  • 3
  • 4
  • 5

步骤8:运行程序

public class App {
	public static void main(String[] args) {
		ApplicationContext ctx = new
		AnnotationConfigApplicationContext(SpringConfig.class);
		BookDao bookDao = ctx.getBean(BookDao.class);
		bookDao.update();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

看到在执行update方法之前打印了系统时间戳,说明对原始方法进行了增强,AOP编程成功。
在这里插入图片描述

5 知识总结

知识点1:@EnableAspectJAutoProxy
在这里插入图片描述
知识点2:@Aspect
在这里插入图片描述
知识点3:@Pointcut
在这里插入图片描述
知识点4:@Before
在这里插入图片描述

源码获取~定制咨询~非开源
微信名片
注:本文转载自blog.csdn.net的老牛源码的文章"https://biyesheji365.blog.csdn.net/article/details/134825809"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top