当前位置: 首页 > article >正文

SpringAOP学习

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

增强原始设计的功能

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.kler.cn/news/326520.html

相关文章:

  • 【C语言软开面经】
  • pdf提取文字:分享3款pdf文字提取软件,赶快收藏起来!
  • Unity开发绘画板——03.简单的实现绘制功能
  • 配置ssh后又报错git@github.com: Permission denied (publickey)
  • Linux【基础指令汇总】
  • 论文翻译 | LLaMA-Adapter :具有零初始化注意的语言模型的有效微调
  • SpringBoot+Thymeleaf发票系统
  • 【2025】springboot基于微信小程序记账本的设计与实现(源码+文档+调试+答疑)
  • kafka集群跨双网段及多网段通信问题解决(避免踩坑)
  • 享元(轻量级)模式
  • Spring Boot 进阶- Spring Boot入门程序详解
  • 初始docker以及docker的基本使用!!!
  • Cannon-es.js之Distance Constrait模拟布料
  • 【hot100-java】【合并两个有序链表】
  • MySQL数据库备份详解
  • Ubuntu下安装向日葵:闪退
  • SpirngBoot核心思想之一IOC
  • Leetcode 46 Permutation Leetcode 78 Subsets
  • AndroidStudio依赖报错
  • 力扣(leetcode)每日一题 1014 最佳观光组合
  • Android 开启相机一键拍照,一键录制
  • VirtualService和destinationRule
  • 大数据毕业设计选题推荐-国潮男装微博评论数据分析系统-Hive-Hadoop-Spark
  • Ranger集成CDH6.3.1详细步骤
  • 『功能项目』下载Mongodb【81】
  • C++中string的使用
  • ​​乐​​牛一​面​​​游​​卡​​一​二​​​​面​
  • 什么是IPv6
  • vue中使用jsencrypt加密
  • 超声波清洗机哪家好用又实惠?2024热门超声波清洗机选择推荐!