博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【2018版】Spring4.3入门视频课程——笔记(三)
阅读量:6683 次
发布时间:2019-06-25

本文共 3071 字,大约阅读时间需要 10 分钟。

视频课程链接:

Spring,day03,主讲:汤小洋

一、AOP

1. 简介

1.1 概念

​ AOP:Aspect Oriented Programming面向切面编程,是OOP面向对象编程的一种补充

​ 将程序中交叉业务逻辑(事务、日志)代码提取出来,封装成切面,由AOP容器在适当时机(位置)将封装的切面动态的织入到具体业务逻辑中

​ AOP不是Spring特有的

1.2 应用场合

​ 适用于具有横切逻辑的场合,如事务管理、日志记录、性能监测、异常通知、访问控制等

【2018版】Spring4.3入门视频课程——笔记(三)

1.3 作用

  • 不改变原有代码的基础上动态添加新的功能
  • 模块化

1.4 术语

  • 连接点 Joinpoint

    程序执行的某个特定位置,如方法调用前、方法调用后、方法抛出异常时、方法调用前后等

  • 切入点 Pointcut

    定位查找到需要的连接点,即切点

  • 增强 Advice 也称为通知

    在切点上执行的一段程序代码,用来实现某些功能

  • 目标对象 Target

    将执行增强处理的目标类

  • 织入 Weaving

    将增强添加到目标类具体切入点上的过程

  • 代理 Proxy

    一个类被织入增强后,会产生一个代理类

  • 切面 Aspect

    切点和增强的组合

  • 引介 Introduction 也称为引入

2. 实现原理

2.1 回顾:代理模式

​ 概念:为其他对象提供一种代理,以控制对这个对象的访问,起到中介的作用

​ 通过代理对象访问目标对象,可以增强额外的操作,扩展目标对象的功能

​ 分类:

  • 静态代理

    代理类是程序员创建或工具生成

    所谓静态就是程序运行之前就已经存在代理类的字节码文件

    缺点:代理对象需要和目标对象实现相同的接口,如果接口增加方法,目标对象和代理对象都要维护

  • 动态代理

    代理类是程序在运行期间由JVM根据反射等机制动态生成的,自动生成代理类和代理对象

    所谓动态就是指在程序运行前不存在代理类的字节码文件

​ 动态代理的两种技术:

  • jdk技术

    Proxy.newProxyInstance(classLoader, //目标类的类加载器    interfaces, //目标类的接口列表  InvocationHandler //交叉业务逻辑);

    特点:目标对象必须实现一个或多个接口,如果没有实现任何接口,则无法使用jdk的动态代理,此时可以使用cglib

  • cglib技术,适用于无接口时使用

2.2 cglib技术

​ 如果没有实现接口,则通过继承来实现的

​ 步骤:

  1. 添加jar包

    cglib
    cglib
    ${cglib.version}
  2. 用法

    Enhancer.create(class, //目标类的类型    InvocationHandler, //交叉业务逻辑);

2.3 AOP原理

​ Spring AOP原理就是使用动态代理

  • 对于实现接口的目标类,使用的是jdk动态代理
  • 对于没有实现任何接口的目标类,使用的是cglib的动态代理

3.Spring AOP的配置方式

3.1 三种配置方式

  • Spring AOP 1.x,使用ProxyFactoryBean手动代理
  • Spring AOP 2.x,基本命名空间的配置
  • Annotation,基于注解的配置(推荐)

3.2 Advice类型

​ Spring AOP支持5种类型的通知(增强)

通知类型 实现接口 描述
前置通知(增强) MethodBeforeAdvice 在方法执行前添加功能
后置通知 AfterReturningAdvice 在方法执行后添加功能
环绕通知 MethodInterceptor 在方法执行前后添加功能
异常通知 ThrowsAdvice 在方法抛出异常后添加功能
引入通知(了解) IntroductionInterceptor 在目标类中添加新方法和属性

注:多个Advice之间不允许有耦合,即多个Advice之间不允许有业务交叉

二、Spring AOP 1.x

1. 基本用法

1.1 添加jar包

org.springframework
spring-aop
org.springframework
spring-aspects

1.2 配置Advice

​ 定义增强类,实现相应的接口

1.3 配置Pointcut

​ 定义切入点,配置位置信息,指定哪些类的哪些方法需要被执行AOP

​ 使用NameMatchMethodPointcutAdvisor根据方法名匹配切入点

​ Advisor是Pointcut和Advice的配置器,Pointcut+Advice=Advisor

login
logout

1.4 配置代理

​ 使用ProxyFactoryBean配置代理

aop04.service.UserService
logAdvisor

2. 练习

​ 对结果进行缓存的计算器

  • 如果已经执行过,则直接从缓存中查找结果
  • 如果未执行过,则调用业务逻辑

​ 运行结果如下:

CalcServiceImpl.add33CalcServiceImpl.add3CalcServiceImpl.minus-1.0-1.03

三、Spring AOP 2.x

1. 简介

​ 基于命名空间的配置,原理是使用后处理器,更简单

​ 特点:

  • 简化配置
  • 非侵入性:编写通知时不需要实现任何接口
  • 使用AspectJ表达式定义切点

2. 基本用法

2.1 配置Advice

​ 定义增强类,不需要实现任何接口,但有多种写法:

写法 说明
public void 方法名(JoinPoint) 前置通知
public void 方法名(JoinPoint,Object) 后置通知
public void 方法名(JoinPoint,Exception) 异常通知
public Object 方法名(ProceedingJoinPoint) 环绕通知

2.2 配置Pointcut并织入

四、AspectJ表达式

1. 简介

​ 切点表达式,一种表达式,用来定义切点位置

2. 用法

2.1 within

​ 语法:within(包名.类名)

​ 匹配该类中的所有方法

2.2 execution

​ 匹配特定包中的特定类中特定返回值类型的特定参数的特定方法

​ 语法:execution(表达式)

​ 表达式:返回值类型 包名.类名.方法名(参数类型)

​ 通配符:* 和 ..

转载于:https://blog.51cto.com/12402007/2156511

你可能感兴趣的文章
Boson 6.0 试验笔记一
查看>>
隐藏滚动条 但是可以滚动
查看>>
PHP 文件操作的各种姿势
查看>>
Javascript语言精粹之正则表达式知识整理
查看>>
pymysql模块
查看>>
教您识别三类钓鱼网站,通过 SSL 数字证书防止恶意欺诈
查看>>
Poj2031--Building a Space Station(Prim )
查看>>
《thinking in Java》--第一章 对象入门
查看>>
python 正则表达式
查看>>
[IOS:OC]如何播放一组图片-简单序列帧动画
查看>>
疏忽Bug
查看>>
ASP.WEB Form 几点知识
查看>>
xmlrpc
查看>>
[转] 钉钉的H5性能优化方案
查看>>
Bash 如何取得当前正在执行的脚本的绝对路径?
查看>>
day1作业--登录接口
查看>>
python基础之函数基础
查看>>
计算机软件基础-(软件开发过程管理)
查看>>
正则表达式匹配非需要匹配的字符串(标题自己都绕晕了)
查看>>
今天Rails都学到了啥
查看>>