oop(面向过程)执行一个功能的顺序 AOP是 (面向切面)各个功能之间横切的功能
AOP通过预编译方式 和 运行期动态代理实现程序功能的统一维护的一种技术。
实现方式 ‘预编译’ ‘运行期动态代理’
通知(Advice)的类型,写法是<aop:after-returning />
面向切面编程如图所示,用统一的切面来处理多个模块,切面横切多个对象;切面对程序员不可见,这样可以大大提高效率。
AOP相关概念
aop实现方式
预编译AspectjJ
SpringAOP
JbossAOP
aop概念和主要功能
AOP基本概念及特点
一、什么是AOP及实现方式
AOP:Aspect Oriented Programming,面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
主要功能:日志记录,性能统计,安全控制,事物处理,异常处理等等。(事务处理:任何操作数据库的方法,尤其是增删改,需要事物的处理,使用AOP时,执行到某种类型的方法,或者某一层的类,自动开启事物和获取连接、提交事物、关闭事物的步骤,简化了操作)
AOP实现方式:1——预编译方式。(AspectJ)
2——运行期动态代理。(JDK动态代理、CGLib动态代理)
(SpringAOP、JbossAOP)
切面的理解:例如系统中有产品管理、订单管理、服务管理等等模块(子功能),任一模块(子功能),都需要记录它的日志,控制它的事物,以及做一些安全验证的功能。但是如果在每一个模块(子功能)中去设计日志、事物、安全验证,会带来大量工作量,尤其当项目达到一定规模时,比如修改日志记录的方式,那么则需要修改每一个模块的日志功能,通过切面方式对开发人员是不可见的,当执行任一模块时,通过预编译或者运行期动态代理方式,都会去记录它的日志,实现了一处写功能,处处可实现的方式,对于开发人员允许不知道有这样功能的存在,这样就简化了操作(修改日志、编写事物等),业务功能横向走,切面垂直业务功能。
二、AOP基本概念(切面—>织入—>目标对象—>切入点—>连接点—>通知—>引入—>AOP代理:“切面”要执行的动作,通过“织入”与所有功能模块进行联系,又通过“目标对象”找到具体功能模块,通过“切入点”将要查找某个功能的某个方法,通过“连接点”找到该功能的特定方法的开始,通过“通知”将要执行何种切面的动作,通过“引入”引入该动作用到的对象和方法,通过“AOP代理”实现该方法。)
AOP相关概念:
1、切面(Aspect):一个关注点(事物),这个关注点可能会横切多个对象(产品管理、订单管理)。
2、连接点(Joinpoint):程序执行过程中的某个特定的点。(一个类中执行的某个方法的开始)。
3、通知(Advice):在切面的某个特定的连接点上执行的动作(方法执行的时候,切面额外执行的动作,比如说方法执行时,开启事物提交功能)。
4、切入点(Pointcut):匹配连接点的断言,在AOP中通知和一个切入点表达式关联(在切面中匹配一个具体的连接点(某个功能的方法的开始))。
5、引入(Introduction):在不修改类代码的前提下,修改的是字节码文件,为类添加新的方法和属性。(类似于编译期动态的修改class文件去增加新的属性和方法,源代码中并没有这样的属性和方法),取决于使用AspectJ和SpringAOP的实现方式,使用方式不同,为类添加属性和方法的方式是有区别的。
6、目标对象(Target Object):被一个或者多个切面所通知的对象。(例如存在一个订单的service(对象)和一个商品的service(对象),执行该模块的功能时,切面会通知相对应的service,在执行数据库操作时,去加上事物的控制,这两个service就是目标对象)。
7、AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(aspect contract),包括通知方法执行等功能(这里执行的方法指的是切面里的执行相应操作所用到的方法)开发时不知道这个对象存在的,也不清楚会创建成什么样子。
8、织入(Weaving):把切面连接到其他的应用程序类型或者对象上,并创建一个被通知的对象,分为:编译时织入、类加载时织入、执行时织入。(使切面和对象(模块功能)牵连起来)
Spring官方文档给出的解释:
Advice(通知)的类型(在切面某个特定连接点执行的动作)
前置通知(Before advice):在某连接点(join point)(某个功能方法开始执行前)之前执行的通知,但不能阻止连接点前的执行(除该方法外的其他方法的执行)(除非它抛出一个异常)。
返回后通知(After returning advice):在某连接点(方法)正常完成后执行的通知(将要执行的切面功能)。
抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知(将要执行切面的功能)。
后通知(After(finally)advice):当某连接点(方法)退出的时候执行的通知(切面将要执行的功能)(不论是正常返回还是异常退出都会执行的通知)。
环绕通知(Around Advice):包围一个连接点(join point)的通知(在整个方法的内部都有切面要执行的功能存在,不分前后)。
Spring框架中AOP的用途:
用途1:提供了声明式的企业服务(也可以是其他服务,例如互联网服务),特别是EJB(重量级框架)的替代服务的声明。
用途2:允许用户定制自己的方面(切面),以完成OOP(面向对象编程,模拟世界中行为和方式,可以理解为实现一个功能的顺序)与AOP(横切的方式,可以理解为各个功能之间横切的一种功能)的互补使用,可以实现自己横切的功能。
三、Spring中的AOP(Spring中AOP的实现方式以及特点)
特点1:纯java实现,无需特殊的编译过程(普通代码需要加载才能执行),不需要控制类加载器层次。可以更好的进行控制(使用类加载器应当谨慎,容易方法生ClassNotFound异常这种情况)。
特点2:目前只支持方法执行连接点(通知Spring Bean的方法执行),(在执行某方法时,才去执行切面的功能)。
特点3:SpringAOP不是为了提供最完整的AOP实现(尽管它非常强大);而是侧重于提供一种AOP实现和Spring IoC容器之间的整合,用于帮助解决企业应用中的常见问题。
特点4:SpringAOP不会与AspectJ(完整的、全面的AOP解决方案)竞争,也不会提供综合全面的AOP解决方案。
有接口和无接口的SpringAOP实现区别:(一个类是否实现了某个接口,例如一个ProductService接口,一个ProductServiceImpl实现了该接口,在这类上切入的切面就是有接口的AOP)
SpringAOP对于有接口的使用标准的JavaSE动态代理作为AOP代理,这使得任何接口(或者接口集)都可以被代理。
SpringAOP对于没有接口的实现类中使用CGLIB代理(如果一个业务对象并没有实现一个接口)
四、Schema-based 实现AOP(基于配置文件实现AOP)
五、API实现AOP(基于API实现AOP)
六、AspectJ实现AOP
听上去AOP有点像个监听,它自运行,在流程触发切入点时,执行与它相关的功能。
那是不是说AOP针对于不同的IOC实例对象,通过加载的标签不同,来执行不同的切入点的功能?
有接口和无接口的Spring AOP实现区别
Spring AOP默认使用标准的JavaSE动态代理作为AOP代理,这使得任何接口(或者接口集)都可以被代理
Spring AOP中也可以使用CGLib代理(如果一个业务对象并没有事项一个接口)
Spring框架中AOP的用途
提供了声明式的企业服务
允许用户定制自己的方面,以完成OOP与AOP的互补使用
Advice的类型
前置通知(Before advice):在某连接点(joinpoint)之前执行的通知,但不能阻止连接点前的执行(除非它抛出一个异常)
返回后通知(After returning advice):在某连接点(join point)正常完成后执行的通知
抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知
后通知(After(finally)advice):当某连接点退出的时候执行的通知(不论时正常返回还是异常退出)
环绕通知(Around Advice):包围一个连接点(joinpoint)的通知
AOP几个相关概念
切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象
连接点(Joinpoint):程序执行过程中的某个特定的点
通知(Advice):在切面的某个特定的连接点上执行的动作
切入点(Pointcut):匹配连接点的断言,在AOP中通知和一个切入点表达式关联
引入(Introduction):在不修改类代码的前提下,为类添加新的方法和属性
目标对象(Target Object):被一个或者多个切面所通知的对象
AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等通知)
织入(Weaving):把切面连接到其他的应用程序类型或者对象上,并创建一个被通知的对象,分为:编译时织入,类加载时织入,执行时织入
AOP实现方式
预编译
-AspectJ
运行期动态代理(JDK动态代理,CGLib动态代理)
-SpringAOP, JbossAOP
切面 图示
什么是AOP
AOP:Aspect Oriented Programming的缩写,
意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等
专题三 AOP
什么是AOP及实现方式
AOP基本概念
Spring中的AOP
Schema-based AOP
Spring AOP API
AspectJ
Advice的类型
AOP相关的几个概念
Advice的类型
AOP几个相关概念
5-1aop切面概念
advice 通知的类型
重要的概念
切面编程与功能垂直的
连接点: 方法的执行
通知: 方法额外执行的切面的动作
切入点: 如何在切入点匹配一个连接点???
AOP proxy:通知方法的执行
AOP,面向切面编程,与垂直业务功能,实现程序功能的统一维护。
主要功能:日志记录,性能统计,安全控制,事物处理,异常处理等等。(事务处理:任何操作数据库的方法,尤其是增删改,需要事物的处理,使用AOP时,执行到某种类型的方法,或者某一层的类,自动开启事务和获取连接、提交事务、关闭事务的步骤,简化了操作)
AOP实现方式:1、预编译方式。(AspectJ) 2、运行期动态代理。(JDK动态代理、CGLib动态代理)(SpringAOP、JbossAOP)
切面的理解:例如系统中有产品管理、订单管理、服务管理等等模块(子功能),任一模块(子功能),都需要记录它的日志,控制它的事务,以及做一些安全验证的功能。但是如果在每一个模块(子功能)中去设计日志、事务、安全验证,会带来大量工作量,尤其当项目达到一定规模时,比如修改日志记录的方式,那么则需要修改每一个模块的日志功能,通过切面方式对开发人员是不可见的,当执行任一模块时,通过预编译或者运行期动态代理方式,都会去记录它的日志,实现了一处写功能,处处可实现的方式,对于开发人员允许不知道有这样功能的存在,这样就简化了操作(修改日志、编写事物等),业务功能横向走,切面垂直业务功能。
二、AOP基本概念(切面—>织入—>目标对象—>切入点—>连接点—>通知—>引入—>AOP代理:“切面”要执行的动作,通过“织入”与所有功能模块进行联系,又通过“目标对象”找到具体功能模块,通过“切入点”将要查找某个功能的某个方法,通过“连接点”找到该功能的特定方法的开始,通过“通知”将要执行何种切面的动作,通过“引入”引入该动作用到的对象和方法,通过“AOP代理”实现该方法。)
AOP相关概念:
1、切面(Aspect):一个关注点(事务),这个关注点可能会横切多个对象(产品管理、订单管理)。
2、连接点(Joinpoint):程序执行过程中的某个特定的点。(一个类中执行的某个方法的开始)。
3、通知(Advice):在切面的某个特定的连接点上执行的动作(方法执行的时候,切面额外执行的动作,比如说方法执行时,开启事物提交功能)。
4、切入点(Pointcut):匹配连接点的断言,在AOP中通知和一个切入点表达式关联(在切面中匹配一个具体的连接点(某个功能的方法的开始))。
5、引入(Introduction):在不修改类代码的前提下,修改的是字节码文件,为类添加新的方法和属性。(类似于编译期动态的修改class文件去增加新的属性和方法,源代码中并没有这样的属性和方法),取决于使用AspectJ和SpringAOP的实现方式,使用方式不同,为类添加属性和方法的方式是有区别的。
6、目标对象(Target Object):被一个或者多个切面所通知的对象。(例如存在一个订单的service(对象)和一个商品的service(对象),执行该模块的功能时,切面会通知相对应的service,在执行数据库操作时,去加上事物的控制,这两个service就是目标对象)。
7、AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(aspect contract),包括通知方法执行等功能(这里执行的方法指的是切面里的执行相应操作所用到的方法)开发时不知道这个对象存在的,也不清楚会创建成什么样子。
8、织入(Weaving):把切面连接到其他的应用程序类型或者对象上,并创建一个被通知的对象,分为:编译时织入、类加载时织入、执行时织入。(使切面和对象(模块功能)牵连起来)
Advice(通知)的类型(在切面某个特定连接点执行的动作)
前置通知(Before advice):在某连接点(join point)(某个功能方法开始执行前)之前执行的通知,但不能阻止连接点前的执行(除该方法外的其他方法的执行)(除非它抛出一个异常)。
返回后通知(After returning advice):在某连接点(方法)正常完成后执行的通知(将要执行的切面功能)。
抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知(将要执行切面的功能)。
后通知(After(finally)advice):当某连接点(方法)退出的时候执行的通知(切面将要执行的功能)(不论是正常返回还是异常退出都会执行的通知)。
环绕通知(Around Advice):包围一个连接点(join point)的通知(在整个方法的内部都有切面要执行的功能存在,不分前后)。
Spring框架中AOP的用途:
用途1:提供了声明式的企业服务(也可以是其他服务,例如互联网服务),特别是EJB(重量级框架)的替代服务的声明。
用途2:允许用户定制自己的方面(切面),以完成OOP(面向对象编程,模拟世界中行为和方式,可以理解为实现一个功能的顺序)与AOP(横切的方式,可以理解为各个功能之间横切的一种功能)的互补使用,可以实现自己横切的功能。
三、Spring中的AOP(Spring中AOP的实现方式以及特点)
特点1:纯java实现,无需特殊的编译过程(普通代码需要加载才能执行),不需要控制类加载器层次。可以更好的进行控制(使用类加载器应当谨慎,容易方法生ClassNotFound异常这种情况)。
特点2:目前只支持方法执行连接点(通知Spring Bean的方法执行),(在执行某方法时,才去执行切面的功能)。
特点3:SpringAOP不是为了提供最完整的AOP实现(尽管它非常强大);而是侧重于提供一种AOP实现和Spring IoC容器之间的整合,用于帮助解决企业应用中的常见问题。
特点4:SpringAOP不会与AspectJ(完整的、全面的AOP解决方案)竞争,也不会提供综合全面的AOP解决方案。
有接口和无接口的SpringAOP实现区别:(一个类是否实现了某个接口,例如一个ProductService接口,一个ProductServiceImpl实现了该接口,在这类上切入的切面就是有接口的AOP)
SpringAOP对于有接口的使用标准的JavaSE动态代理作为AOP代理,这使得任何接口(或者接口集)都可以被代理。
SpringAOP对于没有接口的实现类中使用CGLIB代理(如果一个业务对象并没有实现一个接口)
四、Schema-based 实现AOP(基于配置文件实现AOP)
五、API实现AOP(基于API实现AOP)
六、AspectJ实现AOP
AOP实现方式:1:预编译(aspectj)2:运行期代理(JDK动态代理 CGLib动态代理 SpringAop,JbossAop)
SpringAOP 不是为了提供最完整的AOP实现,而是侧重提供一种AOP实现和Spring IoC容器的整合,帮助解决企业中的问题,他是纯 java 实现的,目前只支持方法执行连接点(通知Spring Bean的方法执行)