spring学习笔记(六)——AOP part3

慕课网,spring入门,第6章Spring AOP的API介绍

  • NameMatchMethodPointcut接口,比如下图mappedNames属性,会匹配sa开头的方法名

  • BeforeAdvice接口

  • ThrowsAdvice接口

afterThrowing方法中,Exception参数是必有的,其他参数可以没有。

  • AfterReturningAdvice接口

  • around advice,MethodInterceptor接口

  • introduction advice,IntroductionInterceptor

ProxyFactoryBean

  • 创建Spring AOP代理的基本方法是使用org.springframework.aop.framework.ProxyFactoryBean
  • 这可以完全控制切入点和通知以及它们的顺序
  •  使用ProxyFactoryBean或其他IoC相关类来创建AOP代理的最重要好处是通知和切入点也可以由IoC来管理
  • 被代理类没有实现任何接口,使用CGLIB代理;否则使用jdk代理
  • 通过设置proxyTargetClass为true,可以强制使用CGLIB
  • 如果目标类实现了一个或多个接口,那么创建代理的类型将依赖ProxyFactoryBean的配置
  • 如果ProxyFactoryBean的proxyInterfaces属性被设置为一个或多个全限定接口名,那么基于jdk的代理将被创建
  • 如果ProxyFactoryBean的proxyInterfaces属性没有被设置,但是目标类实现了一个或多个接口,那么ProxyFactoryBean将自动检测到这个目标类已经实现了至少一个接口,创建一个基于jdk的代理

比如下文配置中,personUser bean最终引用到的是personTarget bean。

  • 可以使用匿名内部bean来隐藏目标和代理之间的区别

  • 前面的例子中如果没有Person接口,spring会使用CGLIB代理,而不是jdk动态代理
  • 如果想,可以强制再任何情况下使用CGLIB,即使有接口
  • CBLIB代理的工作原理是运行时生成目标类的子类,spring配置这个生成的子类委托方法调用原来的目标
  • 子类是用来实现Decorator模式,织入通知
  • CGLIB的代理对用户是透明的,需要注意
    • final方法不能被通知,因为它们不能被覆盖
    • 不用把CGLIB添加到classpath中,在spring3.2中,CGLIB被重新包装并包含在spring核心jar(即基于CGLIB的aop就像jdk动态代理一样“开箱即用”)
  • 用*做通配符,匹配所有拦截器加入通知链

  • 使用父子bean定义,以及内部bean定义,可能会带来更清洁和更简洁的代理定义(抽象属性标记父bean定义为抽象的,它不能被实例化)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值