Spring 中的AOP的通知类型的示例(xml)
个人博客:https://suveng.github.io/blog/
Spring 中的AOP的通知类型的示例
AOP中的通知类型(advice)一共有五中:
- around advice 环绕通知
- before advice 前置通知
- after advice 返回通知
- after-throwing advice 异常返回通知
- 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)相关推荐
- 一文读懂Spring中的AOP机制
一.前言 这一篇我们来说一下 Spring 中的 AOP 机制,为啥说完注解的原理然后又要说 AOP 机制呢? 1.标记日志打印的自定义注解 @Target({ElementType.METHOD}) ...
- 动态代理——》AOP —— Spring 中的 AOP||AOP 相关术语||学习 spring 中的 AOP 要明确的事
AOP 概述 什么是 AOP AOP:全称是 Aspect Oriented Programming 即:面向切面编程 AOP 的作用及优势 作用: 在程序运行期间,不修改源码对已有方法进 ...
- spring中的aop术语和细节
Spring中AOP的细节 说明 我们学习spring的aop,就是通过配置的方式 AOP相关术语 Joinpoint(连接点): 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法, ...
- Spring中的AOP切面编程的三种实现方式
文章目录 Spring中的AOP切面编程的三种实现方式 1.最基本AOP的实现 a.引入jar包 b.编写通知类,这里以后置通知和环绕通知类为例子进行说明 c.在SpringIOC容器中配置 d.测试 ...
- java学习day40(Spring)spring中的aop和基于XML以及注解的AOP配置
第1章 AOP 的相关概念[理解] 1.1AOP 概述 1.1.1 什么是 AOP AOP :全称是 Aspect Oriented Programming 即:面向切面编程. 简单的说它就是把我们程 ...
- Spring中的AOP(三)——基于Annotation的配置方式(一)
为什么80%的码农都做不了架构师?>>> AspectJ允许使用注解用于定义切面.切入点和增强处理,而Spring框架则可以识别并根据这些注解来生成AOP代理.Spring只是 ...
- 手动实现SPring中的AOP(1)
Spring中的AOP是基于JDK的API动态的在内存中创建代理对象的.所以这里先介绍一些设计模式之----代理模式: a) 代理模式的定义:代理(Proxy)模式是一种提供对目标对象 ...
- 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 案例中问题 ...
- 【Spring源码】Spring中的AOP底层原理分析
AOP中的几个概念 Advisor 和 Advice Advice,我们通常都会把他翻译为通知,其实很不好理解,其实他还有另外一个意思,就是"建议",我觉得把Advice理解为&q ...
最新文章
- python慕课视频-python爬虫:爬取网站视频
- python print用法制表空格_python中print函数的输出问题(空格,制表符)
- springcloud不使用数据库微服务启动异常解决
- 为什么要学习Python?怎么学?
- 拳王寻你项目公社:普通人怎么创业,普通人的创业法宝,容易上手的兼职副业项目
- 【nginx】nginx 反向代理 指令说明
- 在下列集成电路说法中不正确_教孩子正确认识性别,保护个人隐私,对成长中的尴尬行为说不...
- 【转】VS2010安装包制作
- 若w=1,x=2,y=3,z=4,则条件表达式wx?w : zy?z : x的结果为 4
- python jinja2_Python jinja2
- 强化学习 Sarsa 实战GYM下的CliffWalking爬悬崖游戏
- 普通人想做自媒体赚钱,应该做什么呢?
- 计算机内存不足360杀毒,电脑内存经常不足到底怎么办
- 准确曝光一学就会 数码相机曝光的秘诀
- 【天嵌使用教程】嵌入式主板VS2008开发windows C#基本流程
- 辽宁初级消防设施操作员考试真题及答案解析
- 关于primarykey 和key的注意事项
- 实战|手把手教你用Python爬虫(附详细源码)
- 香港人才引进只看本科排名,“以本科定终身”是否公平?
- 【LeetCode】675. 为高尔夫比赛砍树