Spring中AOP原理,源码学习笔记
一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能。利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级服务。
系统级服务指的是:事务处理,日志记录,性能统计,安全控制,异常处理等,因为这些功能分散在程序的各个模块中,又是通用的,所以可以将它从业务逻辑中分离出来。
连接点(joinpoint):在连接点可以拦截方法的执行,在连接点前后织入上述的这些系统级服务(织入的就是通知)。
切入点(pointcut):连接点的集合。根据切入点表达式来确定我们将执行拦截的位置。
通知:到达连接点时执行的代码,即我们织入的功能。
以前的Spring,我们要使用AOP,在编写通知时必须实现一些接口,如:实现Before Advice时,Advice类要实现org.springframework.aop.MethodBeforeAdvice接口。
现在有另外两种方式,
(1)基于XML Schema的设置,
1. package com.savage.aop;
2.
3. import org.aspectj.lang.JoinPoint;
4.
5. public class LogBeforeAdvice {
6. public void before(JoinPoint joinPoint) {
7. System.out.println("Logging before " + joinPoint.getSignature().getName());
8. }
9. }
对应XML中的相关配置
<bean id="beforeAdvice" class="test.advice.BeforeAdvice" />
<aop-config>
<aop-aspect id="aspectOne" ref="beforeAdvice">
<aop-pointcut id="pointcutOne exepression="execution(* test.service.*.*(..))" />
<aop-before pointcut-ref="pointcutOne" method="before" /> //也可直接简写成<aop-before pointcut="execution(* test.service.*.*(..))" method="before" />,去掉<aop-pointcut />
</aop-aspect>
</aop-config>
如上,编写通知类不用实现任何接口,JoinPoint对象代表的就是当前连接点,供织入功能时使用,通过它可获得目标对象(getTarget()方法),目标方法名(getSignature().getName()),目标方法接收的实参(getArgs(),返回对象数组)等信息。
(2)注解式写法
在通知类上加注解@Aspect
通知方法上加上通知类型,共有5种通知类型:@Before,@After,@AfterReturning,@AfterThrowing,@Arround
环绕通知最强大,其方法返回类型为Object,第一个参数必须是ProceedingJoinPoint,方法抛出Throwable
http://book.51cto.com/art/200809/90712.htm
在spring配置文件中添加,
<aop:aspectj-autoproxy />
<context:component-scan base-package="studyspringframe" />
或者不通过注解@component定义bean,则
<aop:aspectj-autoproxy />
<bean class="studyspringframe.aspect.advice.AdviceDefine" />
二.关于开源连接池实现DBCP的配置
如图,DBCP连接池配置对应的是对象池GenericObjectPool的属性
Spring中AOP原理,源码学习笔记的更多相关文章
- Spring中AOP相关源码解析
前言 在Spring中AOP是我们使用的非常频繁的一个特性.通过AOP我们可以补足一些面向对象编程中不足或难以实现的部分. AOP 前置理论 首先在学习源码之前我们需要了解关于AOP的相关概念如切点切 ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点
Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...
- Spring源码学习笔记9——构造器注入及其循环依赖
Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...
- Qt Creator 源码学习笔记04,多插件实现原理分析
阅读本文大概需要 8 分钟 插件听上去很高大上,实际上就是一个个动态库,动态库在不同平台下后缀名不一样,比如在 Windows下以.dll结尾,Linux 下以.so结尾 开发插件其实就是开发一个动态 ...
- Qt Creator 源码学习笔记03,大型项目如何管理工程
阅读本文大概需要 6 分钟 一个项目随着功能开发越来越多,项目必然越来越大,工程管理成本也越来越高,后期维护成本更高.如何更好的组织管理工程,是非常重要的 今天我们来学习下 Qt Creator 是如 ...
- async-validator 源码学习笔记(六):validate 方法
系列文章: 1.async-validator 源码学习(一):文档翻译 2.async-validator 源码学习笔记(二):目录结构 3.async-validator 源码学习笔记(三):ru ...
- JUC源码学习笔记4——原子类,CAS,Volatile内存屏障,缓存伪共享与UnSafe相关方法
JUC源码学习笔记4--原子类,CAS,Volatile内存屏障,缓存伪共享与UnSafe相关方法 volatile的原理和内存屏障参考<Java并发编程的艺术> 原子类源码基于JDK8 ...
- Underscore.js 源码学习笔记(下)
上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...
随机推荐
- HTTP请求中的Body构建——.NET客户端调用JAVA服务进行文件上传
PS:今日的第二篇,当日事还要当日毕:) http的POST请求发送的内容在Body中,因此有时候会有我们自己构建body的情况. JAVA使用http—post上传file时,spring框架中 ...
- ASP.NET几种页面数据绑定的用法及区别: <%#、 <%=、 <% 、<%@
< %#... %>: 是在绑定控件DataBind()方法执行时被执行,用于数据绑定 如: < %# Container.DataItem("tit") %&g ...
- MySQL架构
一.MySQL逻辑架构 第一层,即最上一层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等. ...
- wrong requestcode when using startActivityForResult
You are calling startActivityForResult() from your Fragment. When you do this, the requestCode is ch ...
- 学习Scala: 初学者应该了解的知识
Scala开发参照清单 这里列出在开发一个Scala工程中需要参照的资料. 官网网站 http://www.scala-lang.org/ 文档网站 http://docs.scala-lang.or ...
- 【iOS】Quartz2D截屏
一.简单说明 在程序开发中,有时候需要截取屏幕上的某一块内容,比如捕鱼达人游戏.如图: 完成截屏功能的核心代码:- (void)renderInContext:(CGContextRef)ctx;调用 ...
- html alert 的三种方式
html alert 一共有三种方式. 第一种是最简单的直接在js的函数里alert("要输出的内容"); 这种直接就是一个弹出框,显示要输出的内容. 第二种是带选择的弹出框,弹出 ...
- C#生成条形码 Code128算法
条形有很多种,Code128是比较常用的一种,是一种高密度条码, CODE128 码可表示从 ASCII 0 到ASCII 127 共128个字符,故称128码.其中包含了数字.字母和符号字符. Co ...
- jquery 监控文本框键盘事件(回车事件),附常用keycode值。
$(function(){ $(".search").keydown(function(event) { ) { //执行操作 } }) ); 完整的 key press 过程分为 ...
- Fragments之间的交互(实现参数传递)
Fragments之间的交互(实现参数传递) 日常开发中,通常Fragments之间可能需要交互,比如基于用户事件改变Fragment的内容.所有Fragment之间的交互需要通过他们关联的Activ ...