pointcut注解_Spring AOP使用指南,详细了解AOP相关注解

Spring AOP 指导教程

什么是Spring AOP

spring aop可以在spring构建的系统中使用面向切面编程。当然Spring Boot也是基于Spring构建的。使用AOP

可以实现诸如事务,日志以及安全校验等通过切面统一完成的任务。他可以通过简单的注解方式实现在方法执行前后来执行你自己的逻辑。

什么是advice, joinpoint和pointcut

  • Joinpoint:程序的执行点,如方法的执行或者异常的处理。
  • Pointcut:一个用来匹配joinpoint的断言或者表达式。
  • Advice:与一个pointcut关联,并在匹配点运行。

advices的类型

  • Before advice:在join point之前执行的advice,不能阻止程序的继续运行。
  • After returning advice:在join point完成之后执行的advice。
  • After throwing advice:在执行的方法抛出异常之后执行。
  • After advice:在执行的join point退出之后执行不论正常退出或者抛出了异常。
  • Around advice:可以在方法调用之前或之后执行自定义行为,并且还可以选择继续执行join point或者执行另外的方法。
b82ae2743488ea31487b3849ff5f0fc9.png

Spring AOP 示例

编写Aspectclass然后写相应的执行方法并在方法上写joint-point表达式

面向切面编程首先需要在类上加@Aspect注解表名这是一个AOP管理的类,然后在方法上加上point-cut表达式用来匹配joint-point方法。

@Aspectpublic class EmployeeCRUDAspect {  @Before("execution(* EmployeeManager.getEmployeeById(..))") //point-cut expression public void logBeforeV1(JoinPoint joinPoint) { System.out.println("EmployeeCRUDAspect.logBeforeV1() : " + joinPoint.getSignature().getName()); }}

写由切面控制的方法(joint points)

首先将类注入到Spring中,之后写正常的方法即可。

@Componentpublic class EmployeeManager{ public EmployeeDTO getEmployeeById(Integer employeeId) { System.out.println("Method getEmployeeById() called"); return new EmployeeDTO(); }}

在上面的例子中,logBeforeV1方法会在getEmployeeById方法执行之前执行。将会打印如下日志:

EmployeeCRUDAspect.logBeforeV1() : getEmployeeByIdMethod getEmployeeById() called

AOP注解

@Before

在切面控制的方法之前执行。

@Aspectpublic class LoggingAspect {  @Before("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logBeforeAllMethods(JoinPoint joinPoint) { ... }  @Before("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.getEmployeeById(..))") public void logBeforeGetEmployee(JoinPoint joinPoint) { ... }}

logBeforeAllMethods方法会在EmployeeManagerImpl中所有方法执行前执行。

@After

在切面控制的方法之后执行。

@Aspectpublic class LoggingAspect {  @After("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logAfterAllMethods(JoinPoint joinPoint) { ... }  @After("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.getEmployeeById(..))") public void logAfterGetEmployee(JoinPoint joinPoint) { ... }}

@Around

可以在方法执行前后切入。

@Aspectpublic class LoggingAspect {  @Around("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logAroundAllMethods(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("****LoggingAspect.logAroundAllMethods() : " + joinPoint.getSignature().getName() + ": Before Method Execution"); try { joinPoint.proceed(); } finally { //Do Something useful, If you have } System.out.println("****LoggingAspect.logAroundAllMethods() : " + joinPoint.getSignature().getName() + ": After Method Execution"); }​}

@AfterReturning

在方法执行完成且没有抛出任何异常的情况下。

@Aspectpublic class LoggingAspect {  @AfterReturning("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logAfterReturningAllMethods() throws Throwable { System.out.println("****LoggingAspect.logAfterReturningAllMethods() "); }​}

以上示例中只用到了execution方式,还有一种使用@annotation可以对注解了指定接口的方法进行切面编程。这种用法在之前的mybatis多数据源中使用过。

另外还有很多AOP的注解,如果大家感兴趣的话,会继续把剩下的用法写完~

3bbb10b22420e193df51ddfa389b2e21.png
237e3090d8fde87006007e1c1090771f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 实现FTP上传与下载

向FTP服务器下载文件的简单实例 Codestring filePath "d:\\"; string fileName "lhking.txt"; //文件下载之后要保存的路径和文件名 FtpWebRequest reqFTP; try { FileStream outputStream …

Linux源码安装mysql 5.6.12(cmake编译)

转载链接:http://www.2cto.com/database/201307/229260.html Linux源码安装mysql 5.6.12(cmake编译)1.安装make编译器(默认系统自带)下载地址:http://www.gnu.org/software/make/[c-sharp] tar zxvf make-3.82.tar.gz cd make-3.…

云栖专辑 | 阿里开发者们的第6个感悟:享受折磨

2015年12月20日,云栖社区上线。2018年12月20日,云栖社区3岁。阿里巴巴常说“晴天修屋顶”。在我们看来,寒冬中,最值得投资的是学习,是增厚的知识储备。所以社区特别制作了这个专辑——分享给开发者们20个弥足珍贵的成长…

python删除数据库的数据完整代码_利用python操作小程序云数据库实现简单的增删改查...

不止python,你可以利用任何语言那实现通过http请求来操作你自己的小程序云数据库了背景也是在最近吧,小程序更新了云开发 HTTP API 文档,提供了小程序外访问云开发资源的能力,使用 HTTP API 开发者可在已有服务器上访问云资源&…

AI技术在智能海报设计中的应用

背景 在视觉设计领域中,设计师们往往会因为一些简单需求付出相当多的时间,比如修改文案内容,设计简单的海报版式,针对不同机型、展位的多尺寸拓展等。这些工作需要耗费大量的时间、人力成本(5~6张/人日)&am…

javaScript如何监听浏览器关闭事件

转载链接:http://www.cnblogs.com/Tim_Liu/archive/2010/11/09/1872596.html 最近写东西的时候发现需要对浏览器的关闭进行监听,当用户关闭的时候需要调用session.invalid();清空session信息,但是仔细一查手册发现无论是body还是window都没有onclose事件,之后onload…

C++树的实现

C树的实现 STL里面没有提供容器树的模板实现&#xff0c;自已写一个&#xff1a;Tree.h //tree.h 头文件 #include <list> #include <algorithm> using namespace std; struct TreeNode; //定义一个结构体原型 classTree; //定义一个类原型 classIterator; //定义一…

加密文件忘记密码怎么解密_MyBatis 配置文件 用户密码加密存储

properties配置文件一般是使用properties保存配置文件内容,然后在mybatis配置文件中进行读取在resource文件下新建db.properties文件内容如下# 数据库配置文件 driver com.mysql.cj.jdbc.Driver url jdbc:mysql:// /mybatis username password 然后,接着把文件放入源码包…

PHP,如何防止同一用户同一时间多次登录

转载链接&#xff1a;http://blog.sina.com.cn/s/blog_4832ea590101djnp.html PHP&#xff0c;如何防止同一用户同一时间多次登录&#xff1f; 创建表 username password sessionId 张三 123456 ksw9dkw9ksl92w3 备注&#xff1a;用户…

科技前沿智能创新 2019北京智能家居 全屋智能博览会

2019北京智能家居大型展览会 2019北京全屋智能家居博览会报道布展&#xff1a;2019年6月26日-27日 展会开幕&#xff1a;2019年6月28日上午9&#xff1a;00时展会交易&#xff1a;2019年6月28日-30日 展会撤展&#xff1a;2019年6月30日下午14&#xff1a;00时 展览会在北京市政…

java 容器_我也来聊聊,JAVA容器与迭代器

java的容器与迭代器是一个老生常谈的话题了。本文旨在与大家分享一些关于双向链表与迭代器的运用小技巧&#xff0c;并希望本篇文章的内容能够在项目中给你带来帮助。Stack与LinkedListStack是一个LIFO(后进先出)的容器。若要在java中定义一个Stack应该怎么办&#xff1f;也许你…

VS2005调试时变慢解决办法

vs2005生成代码以及调试运行时&#xff0c;如果设置断点系统运行非常缓慢&#xff0c;从网上查阅一些资料后解决&#xff1a; 主要解决办法是&#xff1a; 打开VS2005菜单项"工具"---->"导入导出设置"----->"重置所有设置" 本文参考:http:…

apache目录的访问控制

转载链接&#xff1a;http://blog.sina.com.cn/s/blog_7be8a2150100trml.html 1.根目录的访问控制 DocumentRoot "/var/www/html" <Directory /> Options FollowSymLinks AllowOverride None </Directory> 解释一下&#xff1a; <Dir…

广东高院驳回快播对深圳市场监管局2.6亿罚款案上诉

雷帝网 乐天 12月29日报道据广东高院官方微信消息&#xff0c;广东省高级人民法院对深圳市快播科技有限公司&#xff08;简称快播&#xff09;诉深圳市市场监督管理局&#xff08;简称市场监管局&#xff09;著作权行政处罚纠纷案作出终审宣判&#xff0c;驳回上诉&#xff0c;…

【Vegas原创】恢复Oracle Package的笨方法

imp没有恢复package的参数&#xff0c;所以&#xff0c;只能用笨办法&#xff1a;rowsn&#xff0c;只导入表结构和物件。 步骤&#xff1a; 1&#xff0c;dbca新建一个test数据库&#xff1b; 2&#xff0c;新增user&#xff0c;表空间&#xff0c;给user赋予权限 3&#xff0…

python enumerate函数_关于python中enumerate和zip函数的用法及举例

关于python中enumerate和zip函数的用法及举例关于enumerate函数&#xff1a;enumerate函数可以同时返回列表或元组等可迭代对象的下标和内容&#xff0c;但实际上&#xff0c;enumerate函数实际返回的是一个enumerate类型的可迭代对象&#xff0c;下面是用法举例&#xff1a;se…

php 解析xml 的四种方法(转)

转载链接&#xff1a;http://www.cnblogs.com/likwo/archive/2011/08/24/2151793.html XML处理是开发过程中经常遇到的&#xff0c;PHP对其也有很丰富的支持&#xff0c;本文只是对其中某几种解析技术做简要说明&#xff0c;包括&#xff1a;Xml parser, SimpleXML, XMLReader,…

Golang 微服务系列 go-kit(Log,Metrics,Tracing)

go-kit Log & Metrics & Tracing 微服务监控3大核心 Log & Metrics & Tracing Log Log 模块源码有待分析&#xff08;分析完再补上&#xff09; Metrics 主要是封装 Metrics 接口&#xff0c;及各个 Metrics(Prometheus,InfluxDB,StatsD,expvar) 中间件的封装。…

GDI+

载解压GDI开发包&#xff1b; 2&#xff0e; 正确设置include & lib 目录&#xff1b; 3&#xff0e; stdafx.h 添加&#xff1a; #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include <gdiplus.h> 4&#xff0e; 程序中添加GDI的包含文件gdip…

shell 练习3

1、编写脚本/root/bin/createuser.sh&#xff0c;实现如下功能&#xff1a;使用一个用户名做为参数&#xff0c;如果指定参数的用户存在&#xff0c;就显示其存在&#xff0c;否则添加之&#xff1b;显示添加的用户的id号等信息2、编写脚本/root/bin/yesorno.sh&#xff0c;提示…