spring aop快速使用与详解

说明:若想直接参考如何开发,可直接参考第六点的第8条

学习思路

一、aop介绍

  1. AOP Aspect Oriented Programing 面向切面编程

  2. AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码

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

  4. 使用aop常见应用:性能监控、事务管理、日志记录、缓存

  5. 图示:

二、AspectJ

           AspectJ是一个基于java语言的aop框架,Spring 2.0开始,Spring aop引入了对AspectJ的支持,AspectJ扩展了java语言,提供了一个专门的编译器,在编译时提供横向代码的织入

          最终目标(实际应用):使用AspectJ进行aop编程

三、术语

          目标:Target,被代理增强的对象;例如:UserDao类,功能:save(),update(),delete(),find();

          连接点:JoinPoint ,目标类需要被增强的方法(spring只支持方法级别的连接点,但其他的aop框架像AspectJ还支持构造方法和字段为连接点,但一般开发中方法拦截就可以满足绝大部分需求);

          切点:PointCut,需要被拦截的连接点,或是选中拦截的连接点。例如:UserDao中当你选中save()加强时,save()方法就是切点;

          通知:Advice,增强的代码。例如MyAspect(下图)类中的方法;

          织入:Weaving,将通知(advice)应用到切点(pointCut)的过程;

          引入(引介Introduction):引入允许我们我们向现有的类中添加新方法和属性;(很少使用)

          切面:Aspect,切面是通知和切点的组合。

        

      如果说通知定义了切面的“什么”和“何时”的话,那么切点就是定义了“何地”。切面就是------它是什么,在何时何地和何处完成其功能。

四、从原理到最终目标的推演

      核心:代理。

      代理模式:jdk代理和cglib

1、jdk代理 

     jdk1.3引入动态代理

    a、被代理的类需要实现接口


        

        

2、CGLIB代理

    不需要实现接口


3、代理总结

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

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

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

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

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

    4、标记为final的方法,不能被代理,因为无法进行覆盖 JDK动态代理,是针对接口生成子类,接口中方法不能使用final修饰 CGLib 是针对目标类生产子类,因此类或方法 不能使final的

    5、Spring只支持方法连接点,不提供            属性连接(AspectJ提供属性和构造函数的连接点))

五、spring aop

        1、AOP联盟为通知Advice定义了org.aopalliance.aop.Advice

        2、Spring按照通知Advice在目标类方法的连接点位置,可以分为5类以及需要实现的接口   

a、前置通知 org.springframework.aop.MethodBeforeAdvice在目标方法执行前实施增强

b、后置通知 org.springframework.aop.AfterReturningAdvice在目标方法执行后实施增强

c、环绕通知 org.aopalliance.intercept.MethodInterceptor在目标方法执行前后实施增强

d、异常抛出通知 org.springframework.aop.ThrowsAdvice在方法抛出异常后实施增强

e、引介通知 org.springframework.aop.IntroductionInterceptor在目标类中添加一些新的方法和属性

3、spring的切面类型

.Advisor:代表一般切面,Advice本身就是一个切面,对目标类所有方法进行拦截;、使用普通Advice作为切面,将对目标类所有方法进行拦截,不够灵活,在实际开发中常采用 带有切点的切面

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

常用PointcutAdvisor 实现类:

1、DefaultPointcutAdvisor 最常用的切面类型,它可以通过任意Pointcut和Advice 组合定义切面

2、RegexpMethodPointcutAdvisor 按正则表达式,匹配方法名定义切面,其内部通过JdkRegexpMethodPointcut 构造正则表达式切点

3、AspectJExpressionPointcutAdvisor 用于AspectJ切点表达式定义切点的切面

ntroductionAdvisor:代表引介切面,针对引介通知而使用切面(了解);

4、ProxyFactoryBean常用可配置属性

1、target : 代理的目标对象

2、proxyInterfaces : 代理要实现的接口 如果多个接口可以使用以下格式赋值 <list> <value></value> .... </list>

 

3、proxyTargetClass : 是否对类代理而不是接口,设置为true时,使用CGLib代理

4、interceptorNames : 需要织入目标的Advice

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

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

过渡:

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

解决方案:

自动创建代理 BeanNameAutoProxyCreator 根据Bean名称创建代理 (针对Bean所有方法)

DefaultAdvisorAutoProxyCreator 根据Advisor本身包含信息创建代理 (针对特定的方法)

5、举栗子---------spring 创建代理

1、BeanNameAutoProxyCreator 对所有以Service结尾Bean所有方法使用代理

2、DefaultAdvisorAutoProxyCreator

六、AspectJ

1、AOP的通知类型共5种

before:前置通知(应用:各种校验)在方法执行前执行,如果其中抛出异常,阻止方法运行

after:后通知(应用:清理现场)方法执行完毕后执行,无论方法中是否出现异常

afterReturning:返回后通知(应用:常规数据处理)方法正常返回后执行,如果方法中抛出异常,无法执行

afterThrowing:抛出异常后通知(应用:包装异常信息)方法抛出异常后执行,如果方法没有抛出异常,无法执行

around:环绕通知(应用:十分强大,可以做任何事情)方法执行前后分别执行,可以阻止方法的执行

2、AOP通知类型配置

3、常用属性

pointcut:配置切入点表达式 pointcut-ref:配置切入点引用对象 method:配置切入点执行的通知方法

4、JoinPoint 连接点对象

1. 目标对象:getTarget()

2. 获得方法签名:getSignature()

3. 获得方法名称:getSignature().getName()

4. 获得实际参数:getArgs()

5. 获得当前指定方法的类型:getKind()

5、xml配置

6、启用@AspectJ切面配置


 

7、@AspectJ通知类型

@Before 前置通知,相当于BeforeAdvice

@AfterReturning 后置通知,相当于AfterReturningAdvice

@Around 环绕通知,相当于MethodInterceptor

@AfterThrowing抛出通知,相当于ThrowAdvice

@After 最终final通知,不管是否异常,该通知都会执行

@DeclareParents 引介通知,相当于IntroductionInterceptor (了解)

8、快速应用(配置文件为入口,如需快速开发,可直接参考)

8.1、第一种配置写法

 

 

8.2 第二种配置写法


 

8.3 第三种配置写法,注解


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值