Spring基于注解配置AOP

D:\Java\IdeaProjects\JavaProj\SpringHelloWorld\src\aop.xml


<context:component-scan base-package="com.xiya.spring.aop"/>

在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的Java文件,

如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean

com/xiya/spring/aop/advice/LoggingAspect.java

package com.xiya.spring.aop.advice;

/**
 * Created by N3verL4nd on 2017/3/24.

 */

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

/**
 * 如何把这个类声明为一个切面:
 * 1、把该类放入IOC容器中
 * 2、再声明为一个切面
 */
@Aspect
@Component
public class LoggingAspect {
    //声明该方法是一个前置通知:在目标方法执行之前执行
    @Before("execution(public int com.xiya.spring.aop.service.impl.ArithmeticCalculatorImpl.*(int,int))")
    public void doBefore(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        List args = Arrays.asList(joinPoint.getArgs());
        System.out.println("The method " + methodName + " begins with " + args);

    }

    //后置通知:在目标方法执行后(无论是否发生异常)执行的通知
    //在后置通知中还不能访问目标方法执行的结果
    @After("execution(* com.xiya.spring.aop.service.impl.ArithmeticCalculatorImpl.*(int,int))")
    public void doAfter(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("the method " + methodName + " ends!");
    }
}

com/xiya/spring/aop/service/ArithmeticCalculator.java

package com.xiya.spring.aop.service;

/**
 * Created by N3verL4nd on 2017/3/24.

 */
public interface ArithmeticCalculator {
    int add(int x, int y);
    int sub(int x, int y);
    int mul(int x, int y);
    int div(int x, int y);
}

com/xiya/spring/aop/service/impl/ArithmeticCalculatorImpl.java

package com.xiya.spring.aop.service.impl;

import com.xiya.spring.aop.service.ArithmeticCalculator;
import org.springframework.stereotype.Component;

/**
 * Created by N3verL4nd on 2017/3/24.

 */
@Component
public class ArithmeticCalculatorImpl implements ArithmeticCalculator {
    @Override
    public int add(int x, int y) {
        int result = x + y;
        //int z = 1 / 0;
        return result;
    }

    @Override
    public int sub(int x, int y) {
        int result = x - y;
        return result;
    }

    @Override
    public int mul(int x, int y) {
        int result = x * y;
        return result;
    }

    @Override
    public int div(int x, int y) {
        int result = x / y;
        return result;
    }
}

com/xiya/spring/aop/test/Main.java

package com.xiya.spring.aop.test;

import com.xiya.spring.aop.service.ArithmeticCalculator;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by N3verL4nd on 2017/3/24.

 *
 */
public class Main {
    public static void main(String[] args) {
        //1、创建Spring的IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("aop.xml");

        //2、从IOC容器中获取bean实例
        ArithmeticCalculator calculator = context.getBean(ArithmeticCalculator.class);

        //3、使用bean
        int result = calculator.add(10, 20);
        System.out.println("result = " + result);

        result = calculator.div(10, 2);
        System.out.println("result = " + result);
    }
}

Original: https://www.cnblogs.com/lgh1992314/p/6616192.html
Author: N3verL4nd
Title: Spring基于注解配置AOP

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541524/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Springboot 整合 MyBatisPlus[详细过程]

    Springboot 整合 MyBatisPlus[详细过程] 提要 这里已经将Springboot环境创建好 这里只是整合MyBatis过程 引入Maven依赖 添加MyBati…

    Java 2023年6月9日
    071
  • Java 基础(Optional类)

    Optional提供很多有用的方法,这样我们就不用显式进行空值检测。 OptionalTest.java package com.klvchen.java4; import org…

    Java 2023年5月29日
    074
  • Golang中的空字符,似花不是花

    最近在Linux下开发Go程序,发现一个奇怪的问题,在读取Linux系统信息时读到了空字符,导致了程序异常。在 ASSIC中十六进制0为字符NUT,表示为 空字符NULL。但这个字…

    Java 2023年6月16日
    074
  • 哈工大软件构造复习——LSP原则,协变和逆变

    (防扒链接) 何以牵尘的博客_CSDN博客https://blog.csdn.net/m0_61753302 ;何以牵尘 – 博客园 (cnblogs.com)http…

    Java 2023年6月9日
    090
  • 定位CPU占用高的线程并打印其堆栈信息

    1、首先使用top命令定位到CPU占用高的进程PID 执行top命令,列出所有进程的情况,然后按大写的’P’,按CPU占用大小降序显示进程信息 2、获取线程信息,并找到CPU占用高…

    Java 2023年5月30日
    084
  • CentOS系统在不重启的情况下为虚拟机添加新硬盘

    用过虚拟机的都知道,如果在系统运行的时候去给虚拟机添加一块新设备,比如说硬盘,系统是读取不到这个新硬盘的,因为系统在启动的时候会去检测硬件设备。但是我们也可能会遇到这样的情况,比如…

    Java 2023年5月30日
    082
  • Java反射

    用来动态的操纵Java代码 反射机制的主要作用: 在运行时分析类的能力 在运行时查看对象 实现通用的数组操作代码 利用Method对象 Class类 在Java程序运行时,系统为所…

    Java 2023年6月13日
    076
  • git commit directory如何撤回?

    今日提交代码时一时疏忽提交了数据库配置文件。那么如何撤回呢? 第一步:点击IDEA工具下方Terminal窗口 第二步:输入 git reset –soft HEAD~…

    Java 2023年6月9日
    093
  • SpringBoot文件分片上传

    背景 最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,如图纸,视频等,并且需要在上传大文件过程中进行优化实时展现进度条,…

    Java 2023年6月15日
    067
  • Android Studio快速开发之道

    概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studi…

    Java 2023年6月13日
    055
  • 用两行代码实现重试功能,spring-retry真是简单而优雅

    最近做的一个需求,需要调用第三方接口。正常情况下,接口的响应是符合要求的,只有在网络抖动等极少数的情况下,会存在超时情况。因为是小概率事件,所以一次超时之后,进行一次重试操作应该就…

    Java 2023年6月5日
    073
  • Lambda表达式

    1.常见单方法接口 Comparator Runnable Callable @FunctionalInterface 只定义了单方法的接口称之为 FunctionalInterf…

    Java 2023年6月13日
    090
  • 万字剖析OpenFeign整合Ribbon实现负载均衡的原理

    大家好,前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理,这篇文章来继续剖析SpringCloud组件原理,来看一看OpenFeign是如何基于Ribb…

    Java 2023年6月16日
    085
  • 马士兵多线程直播笔记(上)

    线程与进程 进程: 操作系统分配资源的基本单位。 线程:CPU调度(执行)的基本单位。共享进程的资源。 一个CPU同一时间只能执行一个线程, 表象是线程切换(Context Swi…

    Java 2023年5月30日
    068
  • 22.1.10 二叉树

    22.1.10 二叉树 code: public static void preOrder(TreeNode tree) {    if (tree == null)       …

    Java 2023年6月13日
    064
  • Mybatis:解决调用带有集合类型形参的mapper方法时,集合参数为空或null的问题

    此文章有问题,待修改! 使用Mybatis时,有时需要批量增删改查,这时就要向mapper方法中传入集合类型(List或Set)参数,下面是一个示例。 但是如果传入的集合类型参数为…

    Java 2023年6月6日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球