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 第三种配置写法,注解
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 第三种配置写法,注解
相关文章推荐
- 详解Spring Boot中使用AOP统一处理Web请求日志
- Spring AOP入门使用详解
- Spring boot中使用aop详解
- SpringBoot开发详解(六)-- 异常统一管理以及AOP的使用
- 使用Spring进行面向切面编程(AOP)详解
- 探秘SpringAop(一)_介绍以及使用详解
- 详解使用Spring AOP和自定义注解进行参数检查
- Spring--AOP 详解和使用(一)
- 详解在Spring中如何使用AspectJ来实现AOP
- 详解使用Spring Boot的AOP处理自定义注解
- 详解SpringBoot 使用Spring Initializr 快速构建工程(官方推荐)
- Spring--AOP 详解和使用(二)
- SpringAOP快速使用
- 不要重复DAO!使用Hibernate 和Spring AOP 构建泛型类型安全的DAO
- 使用Spring AOP 自动代理配置声明式事务
- 快速上手Spring--4.安装和使用IDE
- Spring中使用AOP例子
- 快速上手Spring--6. Singleton的使用与否
- HTML快速入门7——URL详解、图片使用
- 使用SPRING AOP框架和EJB组件