每天分享一点Java知识,码字不易,喜欢的可以关注一波,共同学习。20191127

本篇将详细讲解SpringAOP的概念以及如何实现。

1. 何为AOP

AOP:面向切面编程,相对于OOP面向对象编程。

Spring AOP存在的目的是为了解耦,AOP可以让一组类共享相同的行为,在OOP中只能通过继承类喝实现接口,来使代码的耦合度增强,且类继承只能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OOP的不足。

2. AspectJ的注解式切面编程

a. 使用注解@Aspect声明是一个切面;

b. 使用注解@After、@Before、@Around等定义建言(advice),可直接将拦截规则(切点)作为参数;

c. 其中@After、@Before、@Around参数的拦截规则为切点(PointCut),为了使切点复用,可使用@PointCut专门定义拦截规则,然后在@After、@Before、@Around的参数中调用;

d. 其中符合条件的每一个被拦截处为连接点(JoinPoint)。

3. 下面将演示基于注解拦截和基于方法规则拦截两种方式,演示一种模拟记录操作的日志系统的实现。其中注解式拦截能够很好的控制要拦截的粒度和获得更丰富的信息,Spring本身在事务处理(@Transcational)和数据缓存(@Cacheable等)上面都使用此种形式的拦截。

4. 代码示例:

a. 添加依赖

i. 添加Spring Aop支持以及AspectJ依赖

spring-aop依赖

AspectJ依赖

b. 编写拦截规则的实现

拦截规则注解

解释:注解本身是没有功能的,就和xml一样。注解和xml都是一种元数据,元数据即解释数据的数据,这就是所谓配置。注解的功能来自用这个注解的地方。

c. 编写使用注解的被拦截类

注解拦截类

d. 编写使用方法规则被拦截类

e. 编写切面

切面类

解释:

i. 通过@Aspect注解声明一个切面;

ii. 通过@Component让此切面成为Spring容器管理的Bean;

iii. 通过@PointCut注解声明切入点;

iv. 通过@After注解声明一个建言,并使用@PointCut定义的切点;

v. 通过反射可以获得注解上的属性,然后做日志记录相关的操作,下面的相同;

vi. 通过@Before注解声明一个建言,此建言直接使用拦截规则作为参数。

f. 配置类

注解配置

解释:使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持。

g. 运行

运行测试

h. 结果

运行结果

5. 至此,便完成了Spring Aop的实现,相信大家对aop的理解也会更深一步。


想获取完整面试题及答案的同学请点赞、关注并转发。私信楼主:“Java面试题”获取完整资料,更有超全spring、jvm、linux、docker等电子书相送。更有整理的200多页的面试重点知识点,非常全面,需要的私信。

java 切面获取参数_每天分享一点Java知识(spring-aop)相关推荐

  1. java运行时参数_运行时的Java 8参数名称

    java运行时参数 Java 8将引入一种更容易的方法来发现方法和构造函数的参数名称. 在Java 8之前,找到参数名称的方法是在编译阶段打开调试符号,这会在生成的类文件中添加有关参数名称的元信息,然 ...

  2. java菱形乱码 编码_【分享】Java开发过程中中文乱码问题总结

    一.文件乱码处理 1.文件默认编码:默认使用项目的默认编码 右击文件->Properties->Resource->Text file encoding 2.JSP文件编码:由于JS ...

  3. java面试32问_学员分享:JAVA面试32问(11-20)

    第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1;有错,s1是shor ...

  4. java多选代码_[一天一点java web]复选框全选代码

    My JSP 'checkbox.jsp' starting page //通过java script来实现 checkbox 全选复选框 function selectAll(){ //定义个变量 ...

  5. java function获取参数_「Java容器」ArrayList源码,大厂面试必问

    ArrayList简介 ArrayList核心源码 ArrayList源码分析 System.arraycopy()和Arrays.copyOf()方法 两者联系与区别 ArrayList核心扩容技术 ...

  6. java如何获取手机号码_微信小程序+Java获取用户授权手机号码

    前言 小程序内可以直接通过授权获取用户微信号绑定的手机号码或用户添加的其他手机号码,这样可以使得小程序在进行账户的身份可控上又提高了一步,那么应该如何来获取手机号码呢?这篇文章就和大家一起来研究一下. ...

  7. java性能检测工具_老李分享:JAVA性能监控工具

    1.问题 OutOfMemoryError: 内存不足: 内存泄漏 线程死锁 锁竞争(Lock Contention) java消耗过多的CPU 2.java常用健康工具 jps(java virtu ...

  8. java 切面_Java笔试面试精心整理得到89道Spring 核心知识【收藏向】

    点击上方"蓝字",关注了解更多 Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 ...

  9. call线程起名字_高级分享:Java多线程你真的理解透彻了吗?带你玩转一次多线程!...

    不知道怎么引入正文 相信后端同学在开发的时候多多少少都会涉及到多线程开发,作为Java开发的我也同样会经常用到多线程开发. 我认为Java语言在处理多线程上是非常优秀的,我们可以使用简明的代码实现线程 ...

最新文章

  1. python找人脚本_女朋友最近天天加班,用python写个定位脚本,直接抓到现场
  2. 生成sql 脚本没有索引
  3. atitit.loading的设计与实现控件选型attilax 总结
  4. java多线程实现端口扫描,使用Java开发多线程端口扫描工具
  5. P3128 [USACO15DEC]最大流Max Flow
  6. shell脚本编程测试类型下
  7. [css] 如何写高效的CSS?
  8. 面试准备每日五题:C++(三)——全局局部变量、内存分配、strcpysprintfmemcpy、函数指针、引用
  9. 读取配置文件(configparser,.ini文件)
  10. 恐龙机器人钢索恐龙形态_?四川自贡发现距今1.6亿年恐龙化石 已运抵自贡恐龙博物馆...
  11. pandownload 替代品_Pandownload倒下了,找一款替代品
  12. Flask留言板Demo
  13. python编程和excel_Excel Vs. Python?为Excel正名
  14. php调用itchat,itchat接口使用示例
  15. 什么是.NET的程序集?
  16. Linux学习-96-win和vmware的linux系统之间文件传递
  17. android系统最近删除照片,安卓手机最近删除的照片怎么恢复?专家教你这样做...
  18. 治服FME之clipper转换器幺蛾子(出现丢失、多余裁剪结果)
  19. koa-session使用ioredis存储session
  20. 【2018-11-15】中证1000指数的估值详情

热门文章

  1. Mysql8 NDB集群二进制方式免安装配置图解
  2. RASA NLU Chi安装
  3. 一般入职体检都有哪些项目_单位常规体检一般都需要检查哪些项目?
  4. ResNet网络解决的一些事
  5. 基于ZYNQ的机器视觉应用实例
  6. 前端基础12:递归调用,快速排序和简单DOM元素操作
  7. VS扩展开发 一 导航
  8. 制作openstack Centos镜像 -- Example: CentOS image
  9. iOS开发之自定义弹出的键盘
  10. Keeplived配置Nginx双机高可用【转】