SpringAOP学习

news2024/12/27 15:21:31

面向切面编程,指导开发者如何组织程序结构

增强原始设计的功能

oop:面向对象编程

1.导入aop相关坐标,创建

<!--spring依赖-->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
<!--spring-text依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
 <!-- 导入切入点表达式依赖-->

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
 <!-- 导入junit依赖 测试单元-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

2.创建配置类进行Spring注解包扫描

package com.heima.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//写入注解是spring的配置类
@Configuration
//扫描包
@ComponentScan("com.heima")
public class SpringConfig {

}

3.定义业务接口与实现类

jisaunqi

package com.heima.service;

public interface JiSuanQi {
//    加法
    int add(int a, int b);
    //    除法
    int div(int a, int b);


}

jisuanqiimpl 

package com.heima.service.impl;

import com.heima.service.JiSuanQi;

public class JiSuanQiImpl implements JiSuanQi {

    @Override
    public int add(int a, int b) {
        int r = a + b;
        return r;
    }

    @Override
    public int div(int a, int b) {
        int r = a / b;
        return r;
    }
}

生成

 测试库

package com.heima.service.impl;

import com.heima.config.SpringConfig;
import com.heima.service.JiSuanQi;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

//junit测试单元
//启动整合
@RunWith(SpringJUnit4ClassRunner.class)
//指定启动类
@ContextConfiguration(classes={SpringConfig.class})
public class JiSuanQiImplTest extends TestCase {
    @Autowired
    private JiSuanQi jiSuanQi;
    @Test
    public void testAdd() {
        System.out.println(jiSuanQi.add(1, 2));
    }
    @Test
    public void testDiv() {
        System.out.println(jiSuanQi.div(4, 2));
    }
}

 运行测试

4.定义通知,制作通知方法

5.定义切入点表达式,配置切面

建立软件包

建立类

 

类中要写入注解被扫描,

通知方法有4种

1.前置通知

  //1.前置通知
    @Before("pt()")
    public void before(JoinPoint joinPoint) {
        System.out.println("参数为:"+ Arrays.toString(joinPoint.getArgs()));
        System.out.println("我要开始计算了...");
    }

2.后置通知

  //2.后置通知
    @After("pt()")
    public void after() {
        System.out.println("我结束计算了");
    }

3.返回通知

//returning="返回结果对象"
    @AfterReturning(value = "pt()",returning = "r")
    public void afterReturning( Object r) {
        System.out.println("结果为:"+r);
    }

4.异常通知

 //4.异常通知  捕获异常触发
    @AfterThrowing(value = "pt()",throwing = "e")
    public void afterThrowing(Throwable e) {
        System.out.println("计算出现异常"+e.getMessage());
    }

要在配置开启AOP功能

回到测试类里运行测试

 MyAdivice

package com.heima.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.sql.Array;
import java.util.Arrays;

//通知类,写入注解
@Aspect
//被Spring容器扫描到,由于spring容器已写入扫描器
@Component
public class MyAdivice {
    //切点表达式 你想在哪个方法上切入
    //int是参数类型
    //com.heima.service.impl.JiSuanQiImpl.add:找到add方法
    //(int,int)两个参数 参数类型为int
    @Pointcut("execution(int com.heima.service.impl.JiSuanQiImpl.add(int,int))")
    public void pt() {}



    //通知方法
    //1.前置通知
    @Before("pt()")
    public void before(JoinPoint joinPoint) {
        System.out.println("参数为:"+ Arrays.toString(joinPoint.getArgs()));
        System.out.println("我要开始计算了...");
    }

    //2.后置通知
    @After("pt()")
    public void after() {
        System.out.println("我结束计算了");
    }

    //3.返回通知  获取返回结果后触发
    //returning="返回结果对象"
    @AfterReturning(value = "pt()",returning = "r")
    public void afterReturning( Object r) {
        System.out.println("结果为:"+r);
    }


    //4.异常通知  捕获异常触发
    @AfterThrowing(value = "pt()",throwing = "e")
    public void afterThrowing(Throwable e) {
        System.out.println("计算出现异常"+e.getMessage());
    }


}

6.在配置类中开启aop功能

package com.heima.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

//写入注解是spring的配置类
@Configuration

//开启AOP功能
@EnableAspectJAutoProxy
//扫描包
@ComponentScan("com.heima")
public class SpringConfig {

}

简化

    //@Pointcut("execution(int com.heima.service.impl.JiSuanQiImpl.add(int,int))")简化
    //@Pointcut("execution(int com.heima.service.impl.JiSuanQiImpl.add(*,*))")返回类型可以是多个
    //@Pointcut("execution(int com.heima.service.impl.JiSuanQiImpl.add(..))")返回类型可以是多个
    //@Pointcut("execution(int com.heima.service.impl.JiSuanQiImpl.*(..))")这里*代表包里面所有方法都可以运行
    //@Pointcut("execution(* com..impl.*.*(..))")代表意思为包的类型com包下面的所有包和方法
    //@Pointcut("execution(* com..*.*(..))")简化结果

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

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

相关文章

数学建模研赛总结

目录 前言进度问题四分析问题五分析数模论文经验分享总结 前言 本文为博主数学建模比赛第五天的内容记录&#xff0c;希望所写的一些内容能够对大家有所帮助&#xff0c;不足之处欢迎大家批评指正&#x1f91d;&#x1f91d;&#x1f91d; 进度 今天已经是最后一天了&#xf…

MySQL 慢查询日志:洞察性能瓶颈的利器

在 MySQL 数据库的管理和优化中&#xff0c;慢查询日志是一个非常有用的工具。它可以帮助我们找出执行时间较长的查询语句&#xff0c;从而针对性地进行优化&#xff0c;提高数据库的性能。那么&#xff0c;什么是 MySQL 的慢查询日志呢&#xff1f;又该如何配置和使用它呢&…

广西容县霞烟鸡,品牌兴农,助力乡村振兴!

在两广与港澳地区,流传着一句深入人心的饮食谚语——“无鸡不成宴”,它不仅是一种习俗的体现,更是对餐桌礼仪与待客之道的深刻诠释。每逢家宴欢聚、祭祖庆典或盛宴宾客,一只精心烹制的鸡总是不可或缺的主角,其缺席往往被视为对宾客的不敬。在这片美食文化的沃土上,广西容县的霞…

spark-sql建表数据同步到hive

1、基础环境 组件版本备注hadoop3.4.0官方下载hive3.1.3自编译sparkspark-3.5.3-bin-hadoop3官方下载&#xff0c;需要内置hive的jar相关内容paimon0.9.0Maven官方下载jdk1.8.0_41maven3.9.6固定版本 2、停止服务、清理日志 先停止&#xff0c;清理数据 sudo kill -9 $(ps -ef…

kafka 换盘重平衡副本 操作流程

一、起因 kakfa某块数据盘损坏&#xff0c;且数据无法恢复&#xff0c;需清空换新盘 二、梳理操作流程 查看topic信息 sh ./kafka-topics --bootstrap-server ***:9092 --list --exclude-internal 查看某个topic数据分布情况 sh ./kafka-topics --bootstrap-server ***:…

vscode+stfp插件,实现远程自动同步文件代码

概述 远程同步代码&#xff0c;将本地代码实时保存到同一局域网内的另一台电脑&#xff08;linux系统&#xff09;&#xff0c;这里的本地代码也可以是远程服务上的代码&#xff0c;即从一个远程ip同步到另一台远程ip服务器。 工具 vscode&#xff0c;SFTP插件 安装 vscod…

优可测白光干涉仪:激光陀螺仪提升良率与精度的关键

在当今科技日新月异的时代&#xff0c;高精度导航与定位技术已成为航空航天、军事防御、海洋勘探、自动驾驶乃至日常生活中不可或缺的一部分。而在这背后&#xff0c;激光陀螺仪作为核心元件之一&#xff0c;以其卓越的稳定性和极高的精度&#xff0c;正引领着导航技术的新一轮…

Java设计模式概述

设计模式&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。…

python 自定义多线程的传参方式是什么

在 Python 中&#xff0c;threading 模块提供了多线程编程的支持&#xff0c;允许我们通过创建线程类的方式来实现并发操作。当我们自定义线程类时&#xff0c;可以通过修改类的构造方法和运行逻辑来传递和处理参数。 以下面这个实际的代码片段为例来说明&#xff1a; import…

BootROM清除密码

目录 一、组网需求 二、操作步骤 1. console连接设备 2.重启设备 3. 进入BootROM菜单 a. 选择第4项&#xff0c;进入Startup Select菜单 查看系统使用的配置信息 重命名系统使用的配置文件 启动设备 停止Auto-Config 将重命名的配置文件改为可执行文件 恢复配置 重…

迈巴赫 S480 的奢华升级之旅头等舱行政独立 4 座

《迈巴赫 S480 的奢华升级之旅&#xff1a;头等舱行政独立 4 座》 迈巴赫 S480&#xff0c;作为豪华轿车的典范&#xff0c;一直以来都以其卓越的品质和尊贵的体验而备受推崇。而对于那些追求极致奢华与舒适的车主来说&#xff0c;将其升级为头等舱行政独立 4 座的配置&#x…

使用WebClient 快速发起请求(不使用WebClientUtils工具类)

使用WebClient发起网络请求_webclient工具类-CSDN博客文章浏览阅读717次&#xff0c;点赞9次&#xff0c;收藏8次。使用WebClient发起网络请求_webclient工具类https://blog.csdn.net/qq_43544074/article/details/137044825这个是使用工具类发起的&#xff0c;下面就不使用工具…

Chrome浏览器的C++内存管理技术揭秘

Chrome浏览器作为全球最流行的网络浏览器之一&#xff0c;其高效的内存管理技术功不可没。本文将深入探讨Chrome浏览器在C中的内存管理技术&#xff0c;并介绍如何通过调整网页加载时间、优化视频播放体验和解决谷歌浏览器占用CPU过高的问题来提升浏览器性能。 &#xff08;本…

生产绩效考核管理的六大指标

生产绩效考核管理的六大指标 绩效考核是指生产部所有人员通过不断丰富自己的知识、提高自己的技能、改善自己的工作态度&#xff0c;努力创造良好的工作环境及工作机会&#xff0c;不断提高生产效率、提高产品质量、提高员工士气、降低成本以及保证交期和安全生产的结果和行为…

E35.【C语言】判断大/小端序

1.题目 写一个程序实现大/小端序的判断 2.前置知识 见文61.【C语言】数据在内存中的存储 见文65.【C语言】联合体 3.代码 方案一 对于单个变量,判断存储的第一个字节 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {int a 2;if ((*(char*)&…

七星创客:重塑商业模式认知

近期&#xff0c;一个普遍存在的疑问困扰着许多人&#xff1a;“商业模式是否仅仅等同于拉人头或传销活动&#xff1f;”这样的联想或许源于对商业模式概念的片面理解&#xff0c;使得一些人错误地将所有商业模式都笼罩在负面阴影之下。 商业模式&#xff0c;这一商业领域的核心…

两千价位段最亮的激光投影仪?当贝D6X高亮版卷出新高度

当贝D6X系列作为当贝投影上半年发布的重磅新品&#xff0c;其最大的亮点就是采用了AI双屏设计&#xff0c;首创的AI“灵动屏”&#xff0c;不仅颜值吸睛&#xff0c;而且功能多样&#xff0c;一经发布就引发热议。其中&#xff0c;采用三色激光的当贝D6X&#xff0c;因其出色的…

荣耀问鼎!宏山激光斩获2024年度行业创新大奖

8月28日&#xff0c;由高科技行业门户OFweek维科网主办的“维科杯OFweek2024激光行业年度评选”于中国深圳成功举办。宏山激光凭借出类拔萃的技术创新实力与卓越品质&#xff0c;成功斩获“维科杯OFweek2024年度激光行业最佳智能装备/自动化产线技术创新奖”。 这一殊荣绝非偶然…

流水线并行(Pipeline Parallelism)原理详解

文章目录 0. 概览1. 简单流水并行2. GPipe 算法3. GPipe 空间复杂度4. PipeDream 算法5. 总结参考 0. 概览 数据并行&#xff08;Data Parallelism&#xff09;&#xff1a;在不同的GPU上运行同一批数据的不同子集&#xff1b; 流水并行&#xff08;Pipeline Parallelism&…

QCamera6.7笔记

1.QCamera​ .h文件 #include <QtWidgets/QMainWindow> #include "ui_QCamera_test1.h" #include <QCamera> #include <QtMultimedia> #include <QtMultimediaWidgets> #include<QMediaCaptureSession> #include <QMediaDevices&…