AOP 面向切面编程 入门练习

编写过程

添加依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.urfread</groupId><artifactId>untitled1</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>LearnAOP</artifactId><name>Archetype - LearnAOP</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.5</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>6.1.5</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>6.1.5</version></dependency></dependencies>
</project>

Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
<!--    开启组件扫描--><context:component-scan base-package="com.urfread.learnaop"/>
<!--    开启aspectj自动代理,为目标对象生成代理--><aop:aspectj-autoproxy/>
</beans>

接口类和实现类

package com.urfread.learnaop;public interface Calculator {int add(int a, int b);int sub(int a, int b);int mul(int a, int b);int div(int a, int b);
}
package com.urfread.learnaop;import org.springframework.stereotype.Component;@Component("calculator")
public class CalculatorImpl implements Calculator{@Overridepublic int add(int a, int b) {int result = a + b;System.out.println(a+" + "+b+" = "+result);return result;}@Overridepublic int sub(int a, int b) {int result = a - b;System.out.println(a+" - "+b+" = "+result);return result;}@Overridepublic int mul(int a, int b) {int result = a * b;System.out.println(a+" * "+b+" = "+result);return result;}@Overridepublic int div(int a, int b) {int result = a / b;System.out.println(a+" / "+b+" = "+result);return result;}
}

切面类

package com.urfread.learnaop;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Aspect//切面类
@Component//ioc容器
public class LogAspect {//设置切入点和通知类型//切入点表达式:execution(访问修饰符 返回值类型 全类名.方法名(参数列表))//设置通知类型// 前置 @Before(value="切入点表达式配置切入点")@Before("execution(* com.urfread.learnaop.CalculatorImpl.*(..))")public void beforeMethod(){System.out.println("前置通知");}// 返回 @AfterReturning// 异常 @AfterThrowing// 后置 @After// 环绕 @Around}

测试类

import com.urfread.learnaop.Calculator;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestAop {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");Calculator calculator = context.getBean("calculator", Calculator.class);calculator.add(1,2);}
}

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

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

相关文章

Python算法岗面试典型题目及答案

面试Python算法岗位时&#xff0c;候选人通常会遇到一系列设计来考察其编程能力、算法理解和解决问题能力的题目。这些题目范围可以从基本的数据结构操作到更复杂的算法问题。下面是一些典型的上机测试题及其解答示例&#xff1a; 1. 两数之和 题目描述&#xff1a; 给定一个…

使用c++自建循环链表和自建队列分别解决约瑟夫问题

//自建循环链表解决约瑟夫问题 void CircleLinkList::yuesefu(int go_num) { CircleLinkNode* curr = head; CircleLinkNode* prev = nullptr; while (size > 0) { for (int i= 1; i <= go_num; i++) { prev = curr; …

PostgreSQL开发与实战(8.1)PG的锁1

作者&#xff1a;太阳 一、表级锁 1.1 表级锁模式 常见锁模式以及应用场景&#xff1a; ACCESS SHARE &#xff1a;select操作获取该模式锁资源&#xff0c;通常情况下所有只读取不修改表的查询都会获取该模式锁资源 ROW SHARE &#xff1a; select for update 和 select f…

docker搭建EFK

目录 elasticsearch1.创建网络2.拉取镜像3.创建容器如果出现启动失败&#xff0c;提示目录挂载失败&#xff0c;可以考虑如下措施 开放防火墙端口4.验证安装成功重置es密码关闭https连接创建kibana用户创建新账户给账户授权 kibana1.创建容器2.验证安装成功3.es为kibana创建用户…

java对象是怎么在jvm中new出来的,在内存中查看java对象成员变量字段属性值

java对象是怎么在jvm中new出来的 查看java对象字段属性在内存中的值 java 对象 创建 流程 附上java源码 public class MiDept {private int innerFiled999;public MiDept() {System.out.println("new MiDept--------------");}public String show(int data) {Sy…

电脑怎么才能用动态ip上网?步骤详解与优势分析

在数字化时代&#xff0c;互联网已成为我们生活与工作中不可或缺的一部分。为了保障网络安全、提升网络效率或满足特定应用场景的需求&#xff0c;有时我们需要为电脑配置动态IP地址上网。那么&#xff0c;如何为电脑设置动态IP地址呢&#xff1f;本文将为您详细介绍动态IP的配…

为什么AI模型需要合乎道德的数据

道德问题简介 “合乎道德的数据”和“负责任的数据”这两个词的含义可能并不明确。在科技界和AI数据界&#xff0c;道德原则是指负责任地采集和使用数据用以训练模型&#xff0c;并确保这些模型不带偏见地与人类交互。不仅为训练模型负责任地采集和使用数据很重要&#xff0c;…

Java的jmap命令使用详解

jmap命令简介 jmap&#xff08;Java Virtual Machine Memory Map&#xff09;是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。 以外&#xff0c;jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息&#xff0c;比如空间使用率、当前使用的…

Elastic:5 个原因解释为什么可观察性和安全性能够很好地协同工作

作者&#xff1a;来自 Elastic Jennifer Ellard, Gagan Singh 网站可靠性工程师&#xff08;site reliability engineers - SREs&#xff09;和安全分析师 (security analysts) —— 尽管担任着非常不同的角色 —— 分享了许多相同的目标。他们都采用主动监控和事件响应策略来识…

微信小程序(总结)

1、wx.createSelectorQuery 在微信小程序中&#xff0c;wx.createSelectorQuery 是用于创建一个 SelectorQuery 对象的方法&#xff0c;而 this.createSelectorQuery 是在组件中获取元素的方法。 使用 wx.createSelectorQuery 创建的 SelectorQuery 对象可以用于获取页面中的…

JavaScript:nodeType节点/文档碎片对象模型-DcoumentFragment

1伪数组转真数组的方式: 伪数组转真数组的多种方式&#xff1a; 1 Array.from 2 Array.prototype.slice.call(list) 3 [...list] const list1 document.getElementsByTagName(p)//检查list1 是不是 Array数组 的实例 --> false --伪数组console.log(list1 instanceof …

【随笔】Git 高级篇 -- 撤销变更 reset | revert(十四)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

Cuda编程-NPP库

Cuda编程先前有过研究&#xff0c;现在记录下Cuda相关的库使用 目录 0.参考文档1.NPP简介1.1 头文件1.2 库文件1.3 编译时链接关系1.4 NPP函数的命名方式1.5 General Conventions 一般约定1.6 Image Processing Conventions 图像处理约定 2.举例&#xff1a;NPP实现YUV转BGR2.1…

基于Android的记单词App系统的设计与实现

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

【服务器部署篇】Linux下安装Docker容器

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

SqlServer占用CPU过高情况排查

一、问题描述 反馈SQLServer中出现CPU使用率过高有许多可能原因&#xff0c;但常见的原因如下最为常见&#xff1a; 由于以下情况&#xff0c;表或索引扫描导致的高逻辑读取&#xff1a; 过期统计信息缺少索引设计不佳的查询工作负载增加 针对此类问题&#xff0c;微软有一套…

MyBatis如何实现分页

文章目录 MyBatis分页方式对比使用数据库厂商提供的分页查询语句通过自定义 SQL 实现分页逻辑1. 使用 RowBounds 实现分页2. 使用 PageHelper 实现分页 数组分页使用 MyBatis-Plus 进行分页MyBatis物理分页和逻辑分页MyBatis 手写一个 拦截器分页 在 MyBatis 中实现分页通常有两…

数据恢复软件能不能恢复已经删除的监控视频

随着安防意识的日益增强&#xff0c;监控视频已成为众多场所不可或缺的安全保障。然而&#xff0c;由于各种原因&#xff0c;我们可能会不小心删除了一些重要的监控视频。面对这种情况&#xff0c;许多人都会想到使用数据恢复软件来尝试找回这些丢失的视频。那么&#xff0c;数…

堆放砖块-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第47讲。 堆放砖块&#xf…

[xboard]real6410-3 S3C6410光盘资料与功能测试

文章目录 1 real6410官方资源1网盘分享2 镜像测试uboot烧录uboot信息应用功能测试2 ok6410a资源网盘分享3 友善6410资源网盘分享4 友坚网盘分享参考1 real6410官方资源 1网盘分享 real6410 v6.2 链