Spring中AOP的理解
1.AOP的概念
AOP(AspectOriented Programming,面向切面编程)指的是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下个程序动态统一添加功能的一种技术。AOP提供从一个角度来考虑程序结构以完善面向对象编程。它为开发人员提供了一种描述横切关注点的机制,并能够自动将横向关注点入到面向对象的软件系统中,从而实现了横切关注点模块化
AOP一般用于实现那些与业务无关,但是业务模块所共同调用的逻辑,例如异常拦截、事务管理、日志管理和权限控制等,AOP将这些代码封装起来,有利于减少系统的重复代码,降低模块间耦合度,提供可维护性。
AOP的基本概念:Aspect(切面):一个关注点的模块化,这个关注点可能会横切多个对象;Joinpoint(连接点):程序执行过程中某个特定的点,比如处理异常的时候;Advice(通知):在切面的某个特定连接点上执行的操作;Pointcut(切入点):匹配连接点的断言;Introduction(引入):用来给一个类型声明额外的方法和属性;Target Object(目标对象):被一个或多个切面所统治的对象;Weaving(织入):被切面连接到其他应用程序类型或对象上,并创建被通知的对象。
2.AOP的实现原理
AOP的核心实现与IoC一样依赖于Java的反射机制,但是与IoC不同的地方是,IoC用到的相关设计模式是工程模式,而AOP用到的是代理模式。代理模式的思想是不让外部直接访问具体目标,而是需要通过一个代理类才能访问,所有与具体目标的通信都能通过这道“隔离层”来传送请求或返回状态。
3.AOP的通知类型
|
/* 1、Before advice(前置通知):在方法执行之前执行,在一个切面里使用@Before 注解声明通知。配置参考示例如下: */ <bean id="afterReturningAdviceExample" class="完整类名" /> <aop:config proxy-target-class="false"> <!-- 定义切入点 --> <aop:pointcut type="aspectj" id="beforePointcut" exception="execution(*com.itjob.spring.aop..*Manager.*(..))"/> <!-- 定义切面 --> <aop:aspect ref="beforeAdviceExample"> <aop:before pointcut-ref="beforePointcut" method="beforeAspect" /> </aop:aspect> </aop:config> /* execution(*com.itjob.spring.aop..*Manager.(..))表示切入点为com.itjob.spring.aop 包及其子包中以Manager结尾的类的任意方法钱作为切入点 */ /* 2、After returning advice(返回后通知):通常在已匹配的方法返回的时候执行, 也可使用@AfterReturning注释来声明。配置如下 */ <bean id="afterReturningAdviceExample" class="完整类名" /> <aop:config proxy-target-class="false"> <!-- 定义切入点 --> <aop:pointcut type="aspectj" id="afterReturningPointcut" exception="execution(*com.itjob.spring.aop..*Manager.*(..))"/> <!-- 定义切面 --> <aop:aspect ref="afterReturningAdviceExample"> <aop:after-returning pointcut-ref="afterReturningPointcut" method="afterReturningAspect" returning="returnValue"/> </aop:aspect> </aop:config> /* 3、After throwing advice(抛出后通知):在一个方法抛出异常后执行。采用声明 方式定义切入点时,可使用@AfterThrowing注释来声明,配置入下 */ <bean id="afterThrowingAdviceExample" class="完整类名" /> <aop:config proxy-target-class="false"> <!-- 定义切入点 --> <aop:pointcut type="aspectj" id="afterThrowingPointcut" exception="execution(*com.itjob.spring.aop..*Manager.*(..))"/> <!-- 定义切面 --> <aop:aspect ref="afterThrowingAdviceExample"> <aop:after-throwing pointcut-ref="afterThrowingPointcut" method="afterThrowingAspect" throwing="ex"/> </aop:aspect> </aop:config> /* 4、After (finally)advice(后通知):不论一个方法是如何结束的,在它结束后 通知都会运行。若使用声明式,可使用@After注释来声明。这个通知必须处理 正常返回和异常返回两种情况,通常来释放资源,配置如下: */ <bean id="afterAdviceExample" class="完整类名" /> <aop:config proxy-target-class="false"> <!-- 定义切入点 --> <aop:pointcut type="aspectj" id="afterPointcut" exception="execution(*com.itjob.spring.aop..*Manager.*(..))"/> <!-- 定义切面 --> <aop:aspect ref="afterAdviceExample"> <aop:after pointcut-ref="afterPointcut" method="afterAspect" throwing="ex"/> </aop:aspect> </aop:config> /* 5、Around Advice(环绕通知):在一个方法执行之前和之后执行,并且它可以决定 这个方法在什么时候执行、如何执行、甚至是是否执行。声明式的环绕通知可用 @Around注释来声明。 */ <bean id="aroundAdviceExample" class="完整类名" /> <aop:config proxy-target-class="false"> <!-- 定义切入点 --> <aop:pointcut type="aspectj" id="aroundPointcut" exception="execution(*com.itjob.spring.aop..*Manager.*(..))"/> <!-- 定义切面 --> <aop:aspect ref="aroundAdviceExample"> <aop:after pointcut-ref="aroundPointcut" method="aroundAspect" /> </aop:aspect> </aop:config> |
4.AOP适用场景
1)系统权限管理;2)错误处理和异常拦截;3)事务管理;4)持久化;5)同步问题;6)系统调试;7)性能优化;8)日志
Spring中AOP的理解的更多相关文章
- 关于Spring中AOP的理解
AOP简介[理解][重点] 1.AOP(Aspect Oriented Programing)面向切面/方面编程 2.AOP隶属软件工程的范畴,指导开发人员如何制作开发软件,进行结构设计 3.AOP联 ...
- Spring 中aop切面注解实现
spring中aop的注解实现方式简单实例 上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们 ...
- JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解
在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...
- 浅析Spring中AOP的实现原理——动态代理
一.前言 最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...
- Spring中AOP相关的API及源码解析
Spring中AOP相关的API及源码解析 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring ...
- Spring中IOC的理解
Spring中IOC的理解 1.什么是IOC? (1)控制反转.把对象创建和对象间的调用过程交给Spring进行管理. (2)使用IOC的目的:为了耦合度降低. 2.IOC底层原理? (1)xml解析 ...
- Spring中AOP原理,源码学习笔记
一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...
- Spring中AOP简介与切面编程的使用
Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...
- 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)
一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...
随机推荐
- 【转载】Scroller源码解析
原文地址:https://github.com/Skykai521/AndroidSdkSourceAnalysis/blob/master/article/Scroller%E6%BA%90%E7% ...
- HDU 6186 CS Course【前后缀位运算枚举/线段树】
[前后缀枚举] #include<cstdio> #include<string> #include<cstdlib> #include<cmath> ...
- Oracle REGEXP
ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与S ...
- SQL查询中关键词的执行顺序
写在前面:最近的工作主要是写SQL脚本,在编写过程中对SQL的执行和解析过程特别混乱不清,造成了想优化却无从下手.为此专门在网上找博文学习,并做了如下总结. 1.查询中常用到的关键词有: SELECT ...
- POJ 2960 S-Nim 博弈论 sg函数
http://poj.org/problem?id=2960 sg函数几乎是模板题. 调试代码的最大障碍仍然是手残在循环里打错变量名,是时候换个hydra产的机械臂了[超想要.jpg] #includ ...
- 【拓扑排序】【bitset】Gym - 101128A - Promotions
给你一张DAG,若选择u点,则必须先选择所有能到达其的点.问你在选择A个点的情况下,哪些点必选:选择B个点的情况下,哪些点必选:选择B个点的情况下,哪些点一定不选. 选择A个点的情况,必选的点是那些其 ...
- 【线段树区间合并】POJ3667-Hotel
[题意] 一段区间初始均为可行.有两个操作: 1→找出长度为w的一段可行区间,如果存在则返回这个可行区间最靠左的情况,并将该区间设为不可行: 2→将区间[a,b]设为可行区间. [思路] 经典的线段树 ...
- ubuntu16安装navicat字体显示不正常,显示方框以及字体倒立
昨天遇到了这个问题,网上找了很多方法都没有真正解决这个问题. 目前其他博客论坛说的主要方法有 1)将安装目录下的./start_navicat中的字符集改为zh_CN.UTF-8 2)将系统的默认字符 ...
- Problem D: 结构体:计算输入日期是该年的第几天
#include <stdio.h> struct time{ int year; int month; int day;}; int main(void) { struct time s ...
- php中NULL、false、0、" "有何区别?
php中很多还不懂php中0,"",null和false之间的区别,这些区别有时会影响到数据判断的正确性和安全性,给程序的测试运行造成很多麻烦.先看一个例子: <? $str ...