一。Spring AOP概览

1.1。AOP(面向切面编程)是什么

1。 AOP是一种编程范式,而不是编程语言。

  2。解决特写问题,不能解决所有问题

  3。是OOP的补充,不是替代

除了面向切面编程,还有如下编程范式:

  1。面向过程编程:如c/python

  2。面向对象编程:如java/c++

  3。函数式编程

  4。事件驱动编程(GUI开发中比较常见)

  5。面向切面编程

1.2。AOP(面向切面编程)解决的问题

1。DRY:Don't Repeat yourself  避免代码重复问题

2。SoC:Separation of Concerns 关注点分离

(1)。水平分离:展示层-》服务层-》持久层

   (2)。垂直分离:模块划分(订单/库存等业务角度)

(3)。切面分离:分离功能性需求与非功能性需求(把非功能性需求从功能性需求中剥离开来集中管理)

1.3。AOP(面向切面编程)好处

AOP好处即为“集中管理”:

1。集中处理某一关注点/横切逻辑;

2。可以方便的添加/删除关注点;

3。侵入性少,增强代码可读性及可维护性;

1.4。AOP(面向切面编程)应用声景

1。权限控制

2。缓存控制

3。事务控制(数据库事务控制)

4。审计日志(操作记录)

5。性能监控

6。分布式追踪

7。异常处理

以上为偏非功能性需求,特别适合AOP应用声景。

1.5。支持AOP(面向切面编程)的编程语言

java / .net / c / c++ / ruby/ python /php ...

二。案例实战:利用AOP改善既有代码

案例背景:

1。产品管理的服务

2。产品添加/删除操作只能管理员才能进行操作

3。普通实现  VS  AOP实现

(1)。普通实现:在原有业务代码中添加是否为管理员验证,而且每增加一个方法就需要验证一次。麻烦。

(2)。AOP:将验证逻辑从业务代码中独立出来,应用配置文件或注解方式实现。

Step1:添加公共切面验证

上述:

@Pointcut():表示在标注注解AdminOnly上,添加切面。

@Before():表示在之前进行拦截。

Step2:在需要拦截的方法上增加注解,AOP即可以对其进行拦截。

三。Spring AOP使用详解

3.1。使用方式

3.2。Spring AOP主要注解

1。@Aspect注解:主要标注一个java类是Aspect切面配置的一个类。

2。@Pointcut注解:标注要在哪些类哪些方法上植入相应的代码。

3。@Advice注解:什么时机去植入,如在执行之前/之后

3.3。Spring AOP切面表达式介绍

1。wildcards(通配符)

* :匹配任意数量的字符

+ :匹配指定类及其子类

.. :一般用于匹配任意数的子包或参数

2。operators(运算符)

&& :与操作符

||     :或操作符

!   :非操作符

3。designators(指示器:想通过什么方式来匹配你想要的方法)

(1)。within表达式(匹配包/类型)

(2)。匹配对象

说明:

@Pointcut里面的this:一般情况和target一样(有待补充)

target(接口):代表是这个接口的实现类 进行aop

bean(类):匹配这个类里面的所有方法

(3)。匹配参数

(4)。匹配注解

(5)。execution表达式

?:表示是可以省略的。 没有?则表示是必须的。

参数1:修饰符pattern(可选)

参数2:返回值pattern(必须)

参数3:描述层包名pattern(可选)

参数4:描述方法名pattern/方法参数pattern(必须)

参数5:匹配方法抛出哪些异常(可选)

(6)。advice注解--5种

【1】:@Before:前置通知

【2】:@After(finally):后置通知,方法执行完之后

【3】:@AfterReturning:返回通知,成功执行之后

【4】:@AfterThrowing:异常通知,抛出异常之后

【5】:@Around:环绕通知

四。Spring AOP实现原理解析

4.1。原理概述

植入时机:

1。编译期(AspectJ)

2。类加载时(AspectJ5+)

3。运行时(Spring AOP):以spring aop为代表。

运行时是如何植入的?代理对象。从静态代理到动态代理(动态代理实现:基于接口代理与基于继承代理)

4.2。代理模式

类图:

1。静态代理

2。动态代理(基于接口代理与基于继承代理 / jdk代理与Cglib代理)

(1)。JDK代理

(2)。Cglib代理

Spring004--Spring AOP(mooc)的更多相关文章

  1. Spring(二十):Spring AOP(四):基于配置文件的方式来配置 AOP

    基于配置文件的方式来配置 AOP 前边三个章节<Spring(十七):Spring AOP(一):简介>.<Spring(十八):Spring AOP(二):通知(前置.后置.返回. ...

  2. Spring(十九):Spring AOP(三):切面的优先级、重复使用切入点表达式

    背景: 1)指定切面优先级示例:有的时候需要对一个方法指定多个切面,而这多个切面有时又需要按照不同顺序执行,因此,切面执行优先级别指定功能就变得很实用. 2)重复使用切入点表达式:上一篇文章中,定义前 ...

  3. Spring AOP(一)——基础概念

    前文的一些内容更多是针对Spring容器内部的一些特性的描述,接下来一个专题将描述Spring AOP的一些信息,配置细节等等. 介绍 面向切面编程(AOP)是一种新的针对程序结构的思路,它补足了面向 ...

  4. Spring AOP (一)

    一.AOP 是什么? AOP 是Aspect Oriented Programaing 的简称,意思是面向切面编程,AOP的应用场合是受限的,一般只适合于那些具有横切逻辑的应用场合:如性能检测.访问控 ...

  5. Spring(十八):Spring AOP(二):通知(前置、后置、返回、异常、环绕)

    AspectJ支持5种类型的通知注解: @Before:前置通知,在方法执行之前执行: @After:后置通知,在方法执行之后执行: @AfterRunning:返回通知,在方法返回结果之后执行(因此 ...

  6. Spring(十七):Spring AOP(一):简介

    背景: 需求: 给一个计算器计算函数执行前后添加日志. 实现: 1)直接在函数中修改代码: IArithmeticCalculator.java接口类 package com.dx.spring.be ...

  7. Spring AOP(转载)

    此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP 来解决.一方面是为了以更加灵活的方式来解决问题,另一方 ...

  8. 从动态代理到Spring AOP(上)

    一.前言 虽然平时日常开发很少用到动态代理,但是动态代理在底层框架等有着非常重要的意义.比如Spring AOP使用cglib和JDK动态代理,Hibernate底层使用了javassit和cglib ...

  9. spring aop(四)

    直接找到解析aop标签的方法: protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate deleg ...

  10. 从动态代理到Spring AOP(中)

    一.前言 上一章节主要介绍了JDK动态代理和CGLIB动态代理:https://www.cnblogs.com/GrimMjx/p/11194283.html 这一章主要结合我们之前学习的动态代理的基 ...

随机推荐

  1. 魔咒词典 HDU - 1880 (字符串hash 单hash转int或者 双hash )

    哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...

  2. Stylus-富有表现力的、动态的、健壮的CSS

    今天总结一下Stylus记一些常用的也是最基本的用法 一.  选择器 Stylus是基于缩进的这让我们可以更快捷的编写css比如 body { margin:; paddind:; font-size ...

  3. 移动端适配 rem

    前置知识: 物理像素(physical pixel,device pixel) 物理像素(设备像素),显示设备中一个最微小的物理部件.每个像素可以根据操作系统设置自己的颜色和亮度. 设备独立像素(de ...

  4. BZOJ4625 [BJOI2016]水晶 最小割

    题意简述 给你一个三维的坐标系,坐标系上 \((x_i+y_i+z_i)\bmod 3 = 0\) 的点内有能量源.给定 \(n\) 个点含有能量值为 \(c_i\) 的水晶,如果一个水晶位于能量源上 ...

  5. 面试题常考&必考之--js中的call()和apply()

    apply: 接受两个参数,第一个参数是要绑定给this的值,第二个参数是一个参数数组.当第一个参数为null.undefined的时候,默认指向window. call: 第一个参数是要绑定给thi ...

  6. 循环结构for语句-求和思想

    循环结构for语句的练习-求和思想:需求1:求出1到10之间的数据和 public static void main(String[] args) { int sum = 0; for(int i = ...

  7. wxy和zdy眼中的水题 地精部落 dp

    题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到 ...

  8. Activiti的分配任务负责人(八)

    1分配任务负责人 1.1 固定分配 在进行业务流程建模时指定固定的任务负责人 在 properties 视图中,填写 Assignee 项为任务负责人.注意事项由于固定分配方式,任务只管一步一步执行任 ...

  9. GPSMap程序源代码

    1. 界面 第一次打开时选择工程文件 MainActivity.java Tools.OpenDialog(new ICallback(){ public void OnClick(String pa ...

  10. WEB编程 入门简单 进阶难

    其实不论是WEB还是其他什么编程,都是这个道理,至于为什么,我贴几段代码,大家感受下. JS 计算今天是星期几 入门级 // 计算系统当前是星期几 var str =""; var ...