Spring的第十二阶段(01):Spring实现AOP的简单使用

这篇具有很好参考价值的文章主要介绍了Spring的第十二阶段(01):Spring实现AOP的简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、使用Spring实现AOP简单切面编程

需要导入工程的jar包
Spring的核心包

spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar

Spring的测试包

spring-test-4.0.0.RELEASE.jar

Spring日记相关包

commons-logging-1.1.3.jar
log4j-1.2.17.jar

Spring的AOP切面相关的包

spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

需要有的类

public interface Calculate {

	public int add(int num1, int num2);

	public int mul(int num1, int num2);

	public int div(int num1, int num2);

	public int sub(int num1, int num2);
}

@Component
public class Calculator implements Calculate {
	@Override
	public int add(int num1, int num2) {
		return num1 + num2;
	}

	@Override
	public int mul(int num1, int num2) {
		return num1 * num2;
	}

	@Override
	public int div(int num1, int num2) {
		return num1 / num2;
	}

	@Override
	public int sub(int num1, int num2) {
		return num1 - num2;
	}
}
@Aspect
@Component
public class LogUtil {
	@Before(value = "execution(public int com.atguigu.aop.Calculator.add(int, int))")
	public static void logBefore() {
		System.out.println("前置 日记 :【xxx】 方法调用前 。参数1是:xxxx");
	}

	@After(value = "execution(public int com.atguigu.aop.Calculator.add(int, int))")
	public static void logAfter() {
		System.out.println("后置 日记 :【xxxx】 方法调用前 。参数1是:xxxx");
	}

	@AfterReturning(value = "execution(public int com.atguigu.aop.Calculator.add(int, int))")
	public static void logAfterReturn() {
		System.out.println("返回之后: 日记 :【xxxxx】 方法调用前 。参数1是:xxxxxx");
	}

	@AfterThrowing(value = "execution(public int com.atguigu.aop.Calculator.add(int, int))")
	public static void logThrowException() {
		System.out.println("抛异常:日记 :【xxxxx】 方法调用前 。参数1是:xxxxxx");
	}

}

applicationContext.xml配置文件中的内容

<context:component-scan base-package="com.atguigu" />
<aop:aspectj-autoproxy />

测试代码

@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringAopTest {
	@Autowired
	private Calculate calculate;
	@Test
	public void test1() {
		System.out.println( "添加:" + calculate.add(1, 2));
	}
}

测试运行的结果

Spring的第十二阶段(01):Spring实现AOP的简单使用

2、Spring的切入点表达式

@PointCut切入点表达式语法格式是: execution(访问权限 返回值类型 方法全限定名(参数类型列表))

限定符:
*1)	匹配某全类名下,任意或多个方法。
表示匹配com.atguigu.aop.Calculator下以a打头的任意方法。并且返回值和两个参数都是int类型。
execution(public int com.atguigu.aop.Calculator.a*(int, int))

表示匹配com.atguigu.aop.Calculator下的任意方法。并且返回值和两个参数都是int类型。
execution(public int com.atguigu.aop.Calculator.*(int, int))

2)	在Spring中只有public权限能拦截到,访问权限可以省略(访问权限不能写*)。
// 权限省略,表示任意类型的访问权限 ,但Spring现在只支持public权限 
execution(int com.atguigu.aop.Calculator.*(int, int))

3)	匹配任意类型的返回值,可以使用 * 表示
// 表示任意类型的返回值
execution(* com.atguigu.aop.Calculator.*(int, int))

4)	匹配任意子包。
// 表示匹配com的子包
execution(* com.*.aop.Calculator.*(int, int))

5)	任意类型参数
// 表示第二个参数是任意类型
execution(* com.atguigu.aop.Calculator.*(int,*))

..:可以匹配多层路径,或任意多个任意类型参数
// 表示com和aop之间可以有任意层级的包
execution(* com..aop.Calculator.*(int,int))
// 表示第一个参数是int。之后可以有任意个任意类型的参数
execution(* com.atguigu.aop.Calculator.*(int,..))
模糊匹配:
// 表示任意返回值,任意方法全限定符,任意参数
execution(* *(..))
// 表示任意返回值,任意包名+任意方法名,任意参数
execution(* *.*(..))

精确匹配:
// int 返回值,com.atguigu.aop.Calculator类的add方法,两个int参数
execution(public int com.atguigu.aop.Calculator.add(int, int))

切入点表达式连接:&&|| 
// 表示需要同时满足两个表达式
	@Before("execution(public int com.atguigu.aop.Calculator.add(int, int))"
			+ " && "
+ "execution(public * com.atguigu.aop.Calculator.add(..))")

// 表示两个条件只需要满足一个,就会被匹配到
	@Before("execution(public int com.atguigu.aop.Calculator.add(int, int))"
			+ " || "
			+ "execution(public * com.atguigu.aop.Calculator.a*(int))")

3、Spring切面中的代理对象

在Spring中,可以对有接口的对象和无接口的对象分别进行代理。在使用上有些细微的差别。

  1. 如果被代理的对象实现了接口。在获取对象的时候,必须要以接口来接收返回的对象。

测试的代码:
Spring的第十二阶段(01):Spring实现AOP的简单使用
Spring的第十二阶段(01):Spring实现AOP的简单使用

测试的结果:
Spring的第十二阶段(01):Spring实现AOP的简单使用

  1. 被切面拦截的代理对象,如果没有实现接口。获取对象的时候使用对象类型本身
    Spring的第十二阶段(01):Spring实现AOP的简单使用

测试的代码:
Spring的第十二阶段(01):Spring实现AOP的简单使用

测试结果

Spring的第十二阶段(01):Spring实现AOP的简单使用文章来源地址https://www.toymoban.com/news/detail-435554.html

到了这里,关于Spring的第十二阶段(01):Spring实现AOP的简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十二章 Spring Cloud Config 统一配置中心详解

    目录 一、配置问题分析及解决方案 1、问题分析 2、解决方案 二、Spring Cloud Config 介绍 1、Spring Cloud Config特性 2、Spring Cloud Config作用     3、Spring Cloud Config 组件    统一配置中心服务端    统一配置中心客户端 4、Spring Cloud Config 工作流程 三、 配置中心使用 1 搭建远程 git

    2024年02月16日
    浏览(31)
  • 算法通关村第十二关——不简单的字符串转换问题

    字符串是我们在日常开发中最常处理的数据,虽然它本身不是一种数据结构,但是由于其可以包含所有信息,所以通常作为数据的一种形式出现,由于不同语言创建和管理字符串的方式也各有差异,因此针对不同语言特征又产生了很多问题。 常见的字符串转换题目,也就是在

    2024年02月10日
    浏览(36)
  • Spring AOP 实现原理和使用场景

    Spring AOP 是通过在目标方法执行前、执行后、抛出异常时等切入点执行切面代码的一种机制。其实现原理是使用动态代理技术,在方法运行时动态生成代理对象,然后插入切面代码。当执行目标方法时,由动态代理对象拦截方法并在适当的时间点执行切面代码,然后再调用实

    2024年02月05日
    浏览(45)
  • 使用Spring Boot AOP实现日志记录

    目录 介绍 1.1 什么是AOP 1.2 AOP体系与概念 AOP简单实现 2.1 新建一个SpringBoot项目,无需选择依赖 2.2 设置好本地Maven配置后,在pom.xml文件里添加添加maven依赖 2.3 创建一个业务类接口 2.4 在实体类实现接口业务  2.5 在单元测试运行结果 2.6 创建切面类 2.7 再次运行测试  总结 1.

    2024年02月14日
    浏览(45)
  • 不简单的字符串转换问题(算法村第十二关青铜挑战)

    709. 转换成小写字母 - 力扣(LeetCode) 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 1 = s.length = 100 解 大写字母和小写字母的值之间存在固定的差异。例如,小写字母 a 的ASCII值为 97 ,而对应的大写字母 A 的ASCII值为 65 ,两者之差恰

    2024年01月25日
    浏览(37)
  • 【Spring】使用自定义注解方式实现AOP鉴权

    AOP,是一种面向切面编程,可以通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 在软件开发中,鉴权(Authentication)是一项非常重要的安全措施,用于验证用户身份和权限。在应用程序中,我们通常会使用AOP(Aspect-Oriented Programming)来实现鉴权功能

    2024年02月11日
    浏览(39)
  • JAVA:使用 Spring AOP 实现面向切面编程

    1、简述 在现代的软件开发中,面向切面编程(AOP)是一种重要的编程范式,它允许我们将横切关注点(如日志记录、性能监控、事务管理等)从应用程序的核心业务逻辑中分离出来,以提高代码的模块化和可维护性。Spring 框架提供了强大的 AOP 支持,使得我们可以轻松地实

    2024年04月13日
    浏览(34)
  • spring boot 使用AOP实现是否已登录检测

            前后端分离的开发中,用户http请求应用服务的接口时, 如果要求检测该用户是否已登录。可以实现的方法有多种, 本示例是通过aop 的方式实现,简单有效。         约定:前端http的post 请求 1、在pom.xml 引用 2、创建插入标记 3、实现切入类 4 建立api接口,在需要检

    2024年02月20日
    浏览(30)
  • spring之AOP的概念及简单案例

    AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例

    2024年02月05日
    浏览(26)
  • 报错原因:Traceback (most recent call last): File "D:/03.进阶python实验/08.复习进阶python/第十二节/01.自动化查询学习成绩.py"...

    这个错误表明,Selenium在执行你的代码时遇到了一个错误。更具体地,当Selenium试图通过调用 send_keys 方法在一个HTML元素中输入文本时,遇到了一个\\\"ElementNotInteractableException\\\"错误。 这意味着,HTML元素在当前的页面上不可交互。可能的原因包括: 元素在当前页面上不存在 元素

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包