回顾一下Spring AOP的知识
为什么会有面向切面编程(AOP)?
我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。
Spring AOP 中设计的一些核心知识,面试问题?
1、能说一下Spring AOP用的是哪种设计模式?
回答:代理模式。
 
2、 能简单聊一下你对代理模式的理解吗?
代理模式 balabala......,记住一些贴近日常的示例方便理解,如买火车票,Windows 里面的快捷方式...
 
3、 知道JDK代理和Cglib代理有什么区别?
我们不需要创建代理类,JDK 在运行时为我们动态的来创建,JDK代理是接口 balabala
若目标类不存在接口,则使用Cglib生成代理,balabala
不管是JDK代理还是Cglib代理本质上都是对字节码进行操作,balabala
 
4、让你实现一个JDK实现动态代理?你的思路是什么?
照葫芦画瓢,照猫画虎。
Proxy: 定义一个自己的Proxy类
InvocationHandler:定义一个自己的InvocationHandler类
ClassLoad:自定义类加载器(方便加载我们自己指定的路径下面的类)
 
上面简单回顾,并抛出一些问题。带着问题阅读,效果杠杠的。
回到本文的重点
SpringAOP的在实际应用中场景有哪些?
  1. Authentication 权限
  2. Caching 缓存
  3. Context passing 内容传递
  4. Error handling 错误处理
  5. Lazy loading 懒加载
  6. Debugging 调试
  7. logging,tracing,profiling and monitoring 记录跟踪 优化 校准
  8. Performance optimization 性能优化
  9. Persistence 持久化
  10. Resource pooling 资源池
  11. Synchronization 同步
  12. Transactions 事务
  13. Logging 日志
 
以日志为例
假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如
 
 
但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。
但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。
通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置
插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。
为了在指定位置执行这些横向的功能,需要知道指定的是什么地方。
例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是:
  • Before(前置通知) 目标方法调用之前执行
  • After(后置通知) 目标方法调用之后执行
  • After-returning(返回通知) 目标方法执行成功后执行
  • After-throwing(异常通知) 目标方法抛出异常后执行
  • Around(环绕通知) 相当于合并了前置和后置
把切点和通知合在一起就是切面了,一个切面指定了在何时何地执行何种方法。在spring aop中如此定义这个切面:
@Aspect @Component public class HelloAspect { @Before("execution(* com.test.service.impl.HelloServiceImpl.sayHello(..))") public void sayHello(){ System.out.println("hello Java编程技术乐园!"); } }
使用注解@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution表达式声明在这个切点,格式如下:
第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,星号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是sayHello,则是指定了该类中的sayHello方法。然后最后一个参数是方法入参,因为Java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。
总结
我们使用spring aop,有两点需要注意:
1、将切面类声明为一个bean
2、切点指定的方法所在的类也同样需由spring注入才能生效
 
 

Spring AOP应用场景你还不知道?这篇一定要看!的更多相关文章

  1. Spring AOP源码分析--代理方式的选择

    能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 年前写了一个面试突击系列的文章,目前只有redis相关的.在这个系列里,我整理了一些面试题与大家 ...

  2. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

  3. Spring AOP学习笔记01:AOP概述

    1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...

  4. Spring AOP初级——入门及简单应用

      在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是 ...

  5. 死磕Spring之AOP篇 - Spring AOP总览

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  6. 死磕Spring之AOP篇 - Spring AOP自动代理(一)入口

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  7. 死磕Spring之AOP篇 - Spring AOP自动代理(三)创建代理对象

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  8. 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  9. Spring AOP深入理解之拦截器调用

    Spring AOP深入理解之拦截器调用 Spring AOP代理对象生成回想 上一篇博客中:深入理解Spring AOP之二代理对象生成介绍了Spring代理对象是怎样生成的,当中重点介绍了JDK动 ...

随机推荐

  1. leetcode-242 判断两个字符串是不是 Anagram ?

    题目描述 假设给定两个字符串 s 和 t, 让我们写出一个方法来判断这两个字符串是否是字母异位词? 字母异位词就是,两个字符串中含有字母的个数和数量都一样,比如: Example 1: Input: ...

  2. 【NServiceBus】什么是Saga,Saga能做什么

    前言           Saga单词翻译过来是指尤指古代挪威或冰岛讲述冒险经历和英雄业绩的长篇故事,对,这里强调长篇故事.许多系统都存在长时间运行的业务流程,NServiceBus使用基于事件驱动的 ...

  3. LaravelS - 基于Swoole加速Laravel/Lumen

    LaravelS LaravelS是一个胶水项目,用于快速集成Swoole到Laravel或Lumen,然后赋予它们更好的性能.更多可能性.Github 特性 内置Http/WebSocket服务器 ...

  4. html基础——div/span

    div是一个块标签/盒子标签,单独占据一行 span不会占据一块,一般是用来修改某几个文字的格式 比如一行字,需要将每一句的首字母大写,就可以使用span标签 如果是要将一个段落的字加样式,两个都可以 ...

  5. [Odoo12基础教程]之win10中odoo12环境搭建

    所需材料 1.python3.7 2.pycharm社区版及以上 3.postgresSQL10 下载链接:https://www.enterprisedb.com/thank-you-downloa ...

  6. “达观杯”文本分类--baseline

    结合tfidf权重,对“达观杯”提供的文本,进行文本分类,作为baseline,后续改进均基于此. 1.比赛地址及数据来源 "达观杯"文本智能挑战赛 2.代码及解析 # -*- c ...

  7. 网络层 IP

    网络层 -- 数据包 网络层作用 解决什么问题? 在讲网络层之前,其实基于广播的这种通信就可以实现全世界通信了,你吼一声,如果全世界是一个局域网,全世界的计算机肯定可以听得见,从理论上似乎行得通,如果 ...

  8. DevOps on DevCloud|如何采用流水线践行CI/CD理念【华为云技术分享】

    [摘要] 持续集成/持续交付(CI/CD,Continuous Integration/Continuous Deployment)在DevOps CMALS理念中具有支柱性地位,因而CI/CD流水线 ...

  9. Kubernetes增强型调度器Volcano算法分析

    [摘要] Volcano 是基于 Kubernetes 的批处理系统,源自于华为云开源出来的.Volcano 方便 AI.大数据.基因.渲染等诸多行业通用计算框架接入,提供高性能任务调度引擎,高性能异 ...

  10. MySQL必知必会(Create, Alter)

    CREATE DATABASE mysql_crash_course_db; USE mysql_crash_course_db; CREATE TABLE customers ( cust_id i ...