spring中AOP编程

1.什么是AOP

• AOP Aspect Oriented Programing 面向切面编程

• AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)

• Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码


AOP相关术语

Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.

Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.

Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)

Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field.

Target(目标对象):代理的目标对象

Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.

spring采用动态代理织入,而AspectJ采用编译期织入和类装在期织入

Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类

Aspect(切面): 是切入点和通知(引介)的结合




JDK动态代理(传统方法)只能使用实现了接口的类才行



动态代理



运行结果:


使用CGLIB生成代理

• 对于不使用接口的业务类,无法使用JDK动态代理

• CGlib采用非常底层字节码技术,可以为一个类创建子类,解决无接口代理问题


实现类


代理导入包:


测试类

代理知识总结

• Spring在运行期,生成动态代理对象,不需要特殊的编译器

• Spring AOP的底层就是通过JDK动态代理或CGLib动态代理技术 为目标Bean执行横向织入

1.若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。

2.若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。

• 程序中应优先对接口创建代理,便于程序解耦维护

• 标记为final的方法,不能被代理,因为无法进行覆盖

– JDK动态代理,是针对接口生成子类,接口中方法不能使用final修饰

– CGLib 是针对目标类生产子类,因此类或方法 不能使final的

• Spring只支持方法连接点,不提供属性连接


2.Spring AOP增强类型

• AOP联盟为通知Advice定义了org.aopalliance.aop.Interface.Advice

• Spring按照通知Advice在目标类方法的连接点位置,可以分为5类

– 前置通知 org.springframework.aop.MethodBeforeAdvice

• 在目标方法执行前实施增强

– 后置通知 org.springframework.aop.AfterReturningAdvice

• 在目标方法执行后实施增强

– 环绕通知 org.aopalliance.intercept.MethodInterceptor

• 在目标方法执行前后实施增强

– 异常抛出通知 org.springframework.aop.ThrowsAdvice

• 在方法抛出异常后实施增强

– 引介通知 org.springframework.aop.IntroductionInterceptor

• 在目标类中添加一些新的方法和属性


3.Spring AOP切面类型

• Advisor : 代表一般切面,Advice本身就是一个切面,对目标类所有方法进行拦截

• PointcutAdvisor : 代表具有切点的切面,可以指定拦截目标类哪些方法

• IntroductionAdvisor : 代表引介切面,针对引介通知而使用切面(不要求掌握)


Advisor切面案例(接口中的方法全部增强)

• ProxyFactoryBean常用可配置属性

– target : 代理的目标对象

– proxyInterfaces : 代理要实现的接口

• 如果多个接口可以使用以下格式赋值

    <list>

            <value></value>

            ....

    </list>


– proxyTargetClass : 是否对类代理而不是接口,设置为true时,使用CGLib代理(默认的是接口代理,使用jdk代理)

– interceptorNames : 需要织入目标的Advice

– singleton : 返回代理是否为单实例,默认为单例

– optimize : 当设置为true时,强制使用CGLib




前置增强类

配置文件(对所有类的方法都增强)


测试类


PointcutAdvisor 切点切面(增强莫一个方法)

• 使用普通Advice作为切面,将对目标类所有方法进行拦截,不够灵活,在实际开发中常采用 带有切点的切面

• 常用PointcutAdvisor 实现类

– DefaultPointcutAdvisor 最常用的切面类型,它可以通过任意

Pointcut和Advice 组合定义切面

– JdkRegexpMethodPointcut 构造正则表达式切点


没有接口的增强


增强类


配置文件




自动创建代理

• 前面的案例中,每个代理都是通过ProxyFactoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBean开发维护量大

• 解决方案:自动创建代理

– BeanNameAutoProxyCreator 根据Bean名称创建代理

– DefaultAdvisorAutoProxyCreator 根据Advisor本身包含信息创建代理

– AnnotationAwareAspectJAutoProxyCreator 基于Bean中的AspectJ

注解进行自动代理

BeanNameAutoProxyCreator案例(对类中全部方法增强)

基于类名称代理增强


测试类



DefaultAdvisorAutoProxyCreator(切面代理针对摸个方法)




©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容

  • **** AOP 面向切面编程 底层原理 代理!!! 今天AOP课程1、 Spring 传统 AOP2、 Spri...
    luweicheng24阅读 1,362评论 0 1
  • 前言 只有光头才能变强 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模...
    Java3y阅读 6,882评论 8 181
  • 本章内容: 面向切面编程的基本原理 通过POJO创建切面 使用@AspectJ注解 为AspectJ切面注入依赖 ...
    谢随安阅读 3,142评论 0 9
  • “见怪不怪” 接连有新闻报道,一些地方野蛮毁青。 由此,我问一位主流媒体记者:“为什么主流媒体不做报道啊?”...
    邯郸赵金海阅读 388评论 1 3
  • 引入pom 依赖<dependency><groupId>org.springframework.boot</gr...
    PreacherZ阅读 246评论 0 0