个人博客:https://suveng.github.io/blog/​​​​​​​

Spring 中的AOP的通知类型的示例

AOP中的通知类型(advice)一共有五中:

  1. around advice 环绕通知
  2. before advice 前置通知
  3. after advice 返回通知
  4. after-throwing advice 异常返回通知
  5. after-returning advice 正常返回通知

具体详情请查看Spring的官方文档:https://docs.spring.io/spring/docs/5.0.8.RELEASE/spring-framework-reference/core.html#aop-api-advice

那么现在我们来搭建spring的环境。

你可以用很多中方式搭建spring的环境,可以自己导jar包,可以用maven,可以用gradle。

那么我用的是maven。如果想下载spring的文档和jar包,spring官网是下载不了的,需要去到ftp网址。

这里提供网址:https://docs.spring.io/spring/docs/

这里面有spring每一个版本的jar 和docs 文档

那么我用maven,新建一个空的maven工程,然后吧依赖导进去,我这里按照spring模块划分依赖。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>my.suveng</groupId><artifactId>springcoredemo</artifactId><version>1.0-SNAPSHOT</version><properties><org.springframework.version>5.0.8.RELEASE</org.springframework.version></properties><dependencies><!-- spring start --><!--spring core start--><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-indexer</artifactId><version>${org.springframework.version}</version></dependency><!--spring core end--><!--spring aop start--><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${org.springframework.version}</version></dependency><!--spirng aop end--><!--spring aspects start--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${org.springframework.version}</version></dependency><!--spring aspects end--><!--spring instrumentation start --><dependency><groupId>org.springframework</groupId><artifactId>spring-instrument</artifactId><version>${org.springframework.version}</version></dependency><!--spring instrumentation end--><!--spring messaging start --><dependency><groupId>org.springframework</groupId><artifactId>spring-messaging</artifactId><version>${org.springframework.version}</version></dependency><!--spring messaging end--><!--spring data access start --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${org.springframework.version}</version></dependency><!--spring data access end--><!--spring web start --><dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webflux</artifactId><version>${org.springframework.version}</version></dependency><!--spring web end --><!--spring test start --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${org.springframework.version}</version></dependency><!--spring test end --><!-- spring end --><!--junit4--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--end--></dependencies>
<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources>
</build></project>

配置好spring环境后,需要准备一些类来做切点,这里我才用哦面向接口,先建一个UserDao接口和一个实现类,然后将实现类交给spring去管理(使用注解方式)

UserDao.java

/*** author: Veng Su* email: suveng@163.com* date: 2018/8/13 15:11*/
public interface UserDao {public void say();
}

UserDaoImpl.java

/*** author: Veng Su* email: suveng@163.com* date: 2018/8/13 15:12*/
@Component(value = "userDao")
public class UserDaoImpl implements UserDao {public void say() {//        int i=10/0;System.out.println("hello ,suveng ");}
}

这里使用注解,需要用到包扫描注解。

例如:<context:component-scan base-package="spring.my.suveng"/>

到这里切点已经准备好了,那么切面类需要准备一下,也就是增强的内容。

这里新建一个myAspect.java,把它交给spring管理

myAspect.java

/*** author: Veng Su* email: suveng@163.com* date: 2018/8/13 15:25*/
@Component(value = "myAspect")
public class myAspect {//before 切public void beforeF(){System.out.println("我是before");}//after 切public void afterF(){System.out.println("我是after");}//after_throwing 切public void afterTF(){System.out.println("我是after-throwing");}//after-returning 切public void afterRF(){System.out.println("我是after-returning");}//around 切 要把joinpoint给传进来public void aroundF(ProceedingJoinPoint joinPoint){System.out.println("前around");try {joinPoint.proceed();} catch (Throwable throwable) {throwable.printStackTrace();}System.out.println("后 around");}
}

既然切点和切面类已经准备好了,那么可以开始用xml配置了。

beans.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scan base-package="spring.my.suveng"/><!-- 配置 AOP --><aop:config><!-- 配置切面 = 切入点 + 通知 --><aop:aspect ref="myAspect"><!-- 配置切入点expression 表达式execution(想要切的方法写到这里)execution(访问权限 返回值类型 包路径.方法名(参数))--><!--前置通知--><aop:before method="beforeF" pointcut="execution(* *..*.*.say())"/><!--无论程序有没有出错,通知都会执行--><aop:after method="afterF" pointcut="execution(* *..*.*.say())"/><!--执行完后就执行通知,但抛异常或出现错误就不会执行通知--><aop:after-returning method="afterRF" pointcut="execution(* *..*.*.say())"/><!--只有抛异常的时候才会执行通知--><aop:after-throwing method="afterTF" pointcut="execution(* *..*.*.say())"/><!--无论程序有没有出错,环绕通知都会执行--><aop:around method="aroundF" pointcut="execution(* *..*.*.say())"/><!--<aop:around method="arround" pointcut="execution(* *..*.*.save())"/>--></aop:aspect></aop:config>
</beans>

到这里,整个aop已经配置完成了,开始测试:

SpringTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/config/beans.xml")
public class SpringTest {@Resource(name = "userDao")UserDao userDao;@Testpublic void testAop(){userDao.say();}
}

运行结果:

码云源码链接

https://gitee.com/suwenguang/SpringFrameworkDemo

总结

这里是综合测试,读者可以单个测试,把其他注释掉,还可以在切点加入异常,比如除数为0的异常,看看异常会对切面类的造成什么样的影响。其实我做了这个测试,只是我不想贴出来。

使用注解配置aop可以看:

https://blog.csdn.net/qq_37933685/article/details/81673831

AOP的应用很广泛,远不止这么简单,这只是个示例,想知道更多配置aop的方法可以看https://www.yiibai.com/spring_aop/。也可以看spring 官方文档https://docs.spring.io/spring/docs/5.0.8.RELEASE/spring-framework-reference/core.html#aop。加油

Spring 中的AOP的通知类型的示例(xml)相关推荐

  1. 一文读懂Spring中的AOP机制

    一.前言 这一篇我们来说一下 Spring 中的 AOP 机制,为啥说完注解的原理然后又要说 AOP 机制呢? 1.标记日志打印的自定义注解 @Target({ElementType.METHOD}) ...

  2. 动态代理——》AOP —— Spring 中的 AOP||AOP 相关术语||学习 spring 中的 AOP 要明确的事

    AOP 概述 什么是 AOP       AOP:全称是 Aspect Oriented Programming 即:面向切面编程 AOP 的作用及优势 作用: 在程序运行期间,不修改源码对已有方法进 ...

  3. spring中的aop术语和细节

    Spring中AOP的细节 说明 我们学习spring的aop,就是通过配置的方式 AOP相关术语 Joinpoint(连接点): 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法, ...

  4. Spring中的AOP切面编程的三种实现方式

    文章目录 Spring中的AOP切面编程的三种实现方式 1.最基本AOP的实现 a.引入jar包 b.编写通知类,这里以后置通知和环绕通知类为例子进行说明 c.在SpringIOC容器中配置 d.测试 ...

  5. java学习day40(Spring)spring中的aop和基于XML以及注解的AOP配置

    第1章 AOP 的相关概念[理解] 1.1AOP 概述 1.1.1 什么是 AOP AOP :全称是 Aspect Oriented Programming 即:面向切面编程. 简单的说它就是把我们程 ...

  6. Spring中的AOP(三)——基于Annotation的配置方式(一)

    为什么80%的码农都做不了架构师?>>>    AspectJ允许使用注解用于定义切面.切入点和增强处理,而Spring框架则可以识别并根据这些注解来生成AOP代理.Spring只是 ...

  7. 手动实现SPring中的AOP(1)

    Spring中的AOP是基于JDK的API动态的在内存中创建代理对象的.所以这里先介绍一些设计模式之----代理模式: a)         代理模式的定义:代理(Proxy)模式是一种提供对目标对象 ...

  8. java day59【 AOP 的相关概念[理解] 、 Spring 中的 AOP[掌握] 、 Spring 整合 Junit[掌握] 】...

    第1章 AOP 的相关概念[理解] 1.1AOP 概述 1.1.1 什么是 AOP 1.1.2 AOP 的作用及优势 1.1.3 AOP 的实现方式 1.2AOP 的具体应用 1.2.1 案例中问题 ...

  9. 【Spring源码】Spring中的AOP底层原理分析

    AOP中的几个概念 Advisor 和 Advice Advice,我们通常都会把他翻译为通知,其实很不好理解,其实他还有另外一个意思,就是"建议",我觉得把Advice理解为&q ...

最新文章

  1. python慕课视频-python爬虫:爬取网站视频
  2. python print用法制表空格_python中print函数的输出问题(空格,制表符)
  3. springcloud不使用数据库微服务启动异常解决
  4. 为什么要学习Python?怎么学?
  5. 拳王寻你项目公社:普通人怎么创业,普通人的创业法宝,容易上手的兼职副业项目
  6. 【nginx】nginx 反向代理 指令说明
  7. 在下列集成电路说法中不正确_教孩子正确认识性别,保护个人隐私,对成长中的尴尬行为说不...
  8. 【转】VS2010安装包制作
  9. 若w=1,x=2,y=3,z=4,则条件表达式wx?w : zy?z : x的结果为 4
  10. python jinja2_Python jinja2
  11. 强化学习 Sarsa 实战GYM下的CliffWalking爬悬崖游戏
  12. 普通人想做自媒体赚钱,应该做什么呢?
  13. 计算机内存不足360杀毒,电脑内存经常不足到底怎么办
  14. 准确曝光一学就会 数码相机曝光的秘诀
  15. 【天嵌使用教程】嵌入式主板VS2008开发windows C#基本流程
  16. 辽宁初级消防设施操作员考试真题及答案解析
  17. 关于primarykey 和key的注意事项
  18. 实战|手把手教你用Python爬虫(附详细源码)
  19. 香港人才引进只看本科排名,“以本科定终身”是否公平?
  20. 【LeetCode】675. 为高尔夫比赛砍树

热门文章

  1. 『phphot』【SD2.0大会】毛新生:“傻瓜”软件将成用户最爱
  2. 表的记录查询(基础sql语句)
  3. wordpress忘记密码怎么办?
  4. 你真的了解Redis的持久化机制吗?
  5. 别被骗了,win10家庭版MMC是无法创建管理单元的
  6. 宝藏又小众的网页设计UI素材网站分享
  7. 蘑菇街 java_【Java就业前景】蘑菇街2021年Java待遇怎么样-看准网
  8. wordpress添加面包屑
  9. Python(九)元编程
  10. 面试中常被问到的(15)死锁发生及解决