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

©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. winForm学习 2019年4月11日

    1.Directory静态类 相似类:File.Path.StreamReader.StreamWirter 创建文件夹:Directory.CreateDirectory 删除文件夹:Directo ...

  2. .NET CORE(C#) WPF 抽屉式菜单

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. .NET CORE(C#) WPF 抽屉式菜单 阅读导航 本文背景 代码实现 本文参考 源码 ...

  3. 解决visual studio 2013编译过程中存在的无法打开kernel.lib问题

    1. 出现此类问题的原因 由于原visual studio文件中的安装中出现问题,所以原有的SDK(soft development kits)文件出现缺失: 2. 解决方法1 重新下载SDK工具,安 ...

  4. 《自拍教程18》adb_Android设备debug连接工具

    adb命令介绍 做Android App测试,Android手机系统测试, 还有很多Android终端产品(手表,车载,智能电视,智能手表等) 都必须用adb命令,通过USB接口,与Android设备 ...

  5. H5网页布局+css代码美化

    HTML5的结构化标签,对搜索引擎更友好 li 标签对不利于搜索引擎的收录,尽量少用 banner图片一般拥有版权,不需要搜索引擎收录,因此可以使用ul + li <samp></s ...

  6. 如何利用 WPS Office 进行 IIS Log 分析

    找到 IIS Log 打开 Internet Information Service (IIS) Manager 点击左侧 Connections > Sites,在右侧 Sites 列表中定位 ...

  7. Jquery实现挂号平台首页源码

    带二级导航.轮播海报.二级联动.搜索功能.Tab选项卡 按照国际惯例先放图 index.html <!DOCTYPE html> <html lang="zh-cn&quo ...

  8. mui下拉上拉(明一)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  9. conda使用以前安装的python环境

    在装anaconda时,很多时候,我们自己之前安装了python环境,里面装了很多的包,不想换,所以想直接使用原来的python环境,所以可以使用以下命令: conda create --prefix ...

  10. bugku-求getshell(文件上传)

    这道题最主要是考的Content-type参数绕过WAF,然后利用绕过黑名单上传php进行解析. 先上传一个phpinfo()的php文件试试,burp抓包 正常操作,先将下面文件的类型改为:imag ...