您的位置:首页 > 编程语言 > Java开发

spring aop快速使用与详解

2018-03-02 13:59 363 查看
说明:若想直接参考如何开发,可直接参考第六点的第8条学习思路一、aop介绍AOP Aspect Oriented Programing 面向切面编程
AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码
使用aop常见应用:性能监控、事务管理、日志记录、缓存
图示:


二、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代理和cglib1、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 : 需要织入目标的Advice5、singleton : 返回代理是否为单实例,默认为单例6、optimize : 当设置为true时,强制使用CGLib过渡:每个代理都是通过ProxyFactoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBean开发维护量巨大解决方案:自动创建代理 BeanNameAutoProxyCreator 根据Bean名称创建代理 (针对Bean所有方法)DefaultAdvisorAutoProxyCreator 根据Advisor本身包含信息创建代理 (针对特定的方法)5、举栗子---------spring 创建代理1、BeanNameAutoProxyCreator 对所有以Service结尾Bean所有方法使用代理

2、DefaultAdvisorAutoProxyCreator

六、AspectJ1、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 第三种配置写法,注解
 

 


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息