================================

©Copyright 蕃薯耀 2020-01-21

https://www.cnblogs.com/fanshuyao/

一、第一步,引用依赖类,在Pom.xml加入依赖

<dependencies>

        <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.12.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.12.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.12.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.12.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.12.RELEASE</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency> </dependencies>

二、第二步:增加配置类

1、@Configuration:声明该类为配置类

2、@ComponentScan("com.lqy.spring.aop"):扫描相应的类,纳入spring容器中管理

3、@EnableAspectJAutoProxy:启用注解方式的Aop模式

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy; @Configuration
@ComponentScan("com.lqy.spring.aop")
@EnableAspectJAutoProxy
public class AopConfig { }

三、第三步:自定义逻辑运算

import org.springframework.stereotype.Component;

/**
* Calculator类需要在spring容器才能使用aop
* 使用:@Component,同时使用@ComponentScan注解扫描时,要扫描到该类
*
*/
@Component
public class Calculator { public int divInteger(int a, int b) {
System.out.println("除法运算");
return a/b;
} public double div(double a, double b) {
System.out.println("除法运算");
return a/b;
} public double add(double a, double b) {
System.out.println("加法运算");
return a + b;
}
}

四、第四步:运算逻辑类切面注入类

1、@Before:方法执行之前

2、@After:方法执行之后(不管会不会出现异常都会执行)

3、@AfterReturning:方法正常执行返回之后

4、@AfterThrowing:方法发生异常执行

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component; /**
* 类需要在spring容器才能使用aop,并且添加切面类的注解:@Aspect
*
*/
@Aspect
@Component
public class CalculatorAop { /**
* 公共切点
*/
@Pointcut("execution( * com.lqy.spring.aop.Calculator.*(..))")
public void pointCut() {} /**
* 方法执行之前
*/
@Before(value = "execution( * com.lqy.spring.aop.Calculator.*(..))")
public void before(JoinPoint joinPoint) {
System.out.println("");
System.out.println("===============================================================");
System.out.println("before方法:{" + joinPoint.getSignature().getDeclaringTypeName() + "." +joinPoint.getSignature().getName() + "}开始执行:");
System.out.println("方法参数是:{" + Arrays.asList(joinPoint.getArgs()) + "}"); } /**
* 方法执行之后(不管会不会出现异常都会执行)
* pointCut():使用公共的切点表达式
*/
@After("pointCut()")
public void after(JoinPoint joinPoint) {
System.out.println("after方法:{" + joinPoint.getSignature().getDeclaringTypeName() + "." +joinPoint.getSignature().getName() + "}执行结束。");
} /**
* 方法正常执行返回之后
*/
@AfterReturning(value = "pointCut()", returning = "returnResult")
public void afterReturn(JoinPoint joinPoint, Object returnResult) {
System.out.println("afterReturn方法:{" + joinPoint.getSignature().getDeclaringTypeName() + "." +joinPoint.getSignature().getName() + "}执行返回的结果是:{" + returnResult + "}。");
System.out.println("");
} /**
* 方法出现异常执行
*/
@AfterThrowing(value = "pointCut()", throwing = "ex")
public void afterThrowing(JoinPoint joinPoint, Exception ex) {
System.out.println("afterThrowing方法:{" + joinPoint.getSignature().getDeclaringTypeName() + "." +joinPoint.getSignature().getName() + "}发生异常:" + ex);
} }

五、第五步:测试

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.lqy.spring.aop.Calculator;
import com.lqy.spring.config.AopConfig; public class TestAop { private AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AopConfig.class); @Test
public void testDiv() {
Calculator cal = ac.getBean(Calculator.class);//Calculator类需要在spring容器才能使用aop
//System.out.println(cal.div(3, 0));
System.out.println(cal.add(3, 2));
System.out.println(cal.divInteger(3, 0));
} }

测试结果

===============================================================
before方法:{com.lqy.spring.aop.Calculator.add}开始执行:
方法参数是:{[3.0, 2.0]}
加法运算
after方法:{com.lqy.spring.aop.Calculator.add}执行结束。
afterReturn方法:{com.lqy.spring.aop.Calculator.add}执行返回的结果是:{5.0}。 5.0 ===============================================================
before方法:{com.lqy.spring.aop.Calculator.divInteger}开始执行:
方法参数是:{[3, 0]}
除法运算
after方法:{com.lqy.spring.aop.Calculator.divInteger}执行结束。
afterThrowing方法:{com.lqy.spring.aop.Calculator.divInteger}发生异常:java.lang.ArithmeticException: / by zero

(如果你觉得文章对你有帮助,欢迎捐赠,^_^,谢谢!)

================================

©Copyright 蕃薯耀 2020-01-21

https://www.cnblogs.com/fanshuyao/

spring aop使用,spring aop注解,Spring切面编程的更多相关文章

  1. Java实战之03Spring-03Spring的核心之AOP(Aspect Oriented Programming 面向切面编程)

    三.Spring的核心之AOP(Aspect Oriented Programming 面向切面编程) 1.AOP概念及原理 1.1.什么是AOP OOP:Object Oriented Progra ...

  2. Spring AOP中使用@Aspect注解 面向切面实现日志横切功能详解

    引言: AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一 ...

  3. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  4. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  5. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  6. spring入门(四)【面向切面编程】

    开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而 ...

  7. Spring详解(五)------面向切面编程

    .AOP 什么? AOP(Aspect Oriented Programming),通常称为面向切面编程.它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的 ...

  8. Java AOP (2) runtime weaving 【Java 切面编程 (2) 运行时织入】

    接上一篇 Java AOP (1) compile time weaving [Java 切面编程 (1) 编译期织入] Dynamic proxy   动态代理 Befor talking abou ...

  9. SpringAop@Aspect注解实现切面编程

    SpringAOP在springboot中如何使用 #什么是aop## 概念> aop全称Aspect OrientedProgramming,面向切面,AOP主要实现的目的是针对业务处理过程中 ...

  10. Spring(4)——面向切面编程(AOP模块)

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

随机推荐

  1. java.math包下计算浮点数和整数的类

    (1)BigIntege:实现任意精度的整数运算.(2)BigDecimal:实现任意精度的浮点运算. 例如: 使用BigDecimal进行浮点数比较 import java.math.BigDeci ...

  2. Kafka消费者没有收到通知的分析

    今天遇到两位三方人员跟我反馈,某微服务的异步接口功能不正常了,由于该异步接口采用Kafka异步消息的方案,对方说没有收到Kafka给消费者的通知,根据此问题,联系了相关人员进行了分析: (一)明确环境 ...

  3. JavaSE学习笔记(12)---线程

    JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...

  4. MySQL常用命令.md

    链接数据库 ## -h/-u这些后面没有空格 ./bin/mysql -h[ip地址] -P[端口号] -u[用户名] -p[密码] 查看建表语句 show create table [table_n ...

  5. 剑指offer-面试题53_3-数组中数值和下标相等的元素-二分查找

    /* 题目: 求单调递增数组中,数值与下标相等的任意数字. */ /* 思路: 二分法. */ #include<iostream> #include<cstring> #in ...

  6. maven的核心概念——POM

    Project Object Model:项目对象模型.将Java工程的相关信息封装为对象作为便于操作和管理的模型.Maven工程的核心配置.可以说学习Maven就是学习pom.xml文件中的配置. ...

  7. Mybaits(10)N+1问题

    N+1问题 从上面的例子日志中我们可以看到所有级联都成功了,但是引发了性能问题,例如我们在查询雇员的信息和工作任务信息,此时体检表和工牌信息就是多余,我们没必要查询一次.如果想日志体现的那样,取出了所 ...

  8. 在IE8的基础上安装IE11

    安装包下载 链接:https://pan.baidu.com/s/1WAuyMg_SrfVa0wLjoop5Jw   提取码:nh1r 安装方式 先运行 - EIE11_ZH-CN_WOL_WIN76 ...

  9. HDU1070 - Milk

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1070 解题思路:主要考察C结构体排序. #include <bits/stdc++.h> ...

  10. 剑指offer-面试题6-从头到尾打印链表-链表

    /* 题目: 输入一个链表的头节点,从尾到头反过来打印每个节点的值 */ /* 思路: 解法一:利用栈后进先出的特性. 解法二:利用递归函数的性质. */ void PrintListReversin ...