我们知道在OOP中模块化的关键单元是类,类封装了一类对象的行为和状态,当多个类有共同的属性和行为时候我们把这些共同的东西封装为一个基类,然后多个类可以通过继承基类的方式来复用这些共同的东西,如果子类需要定制基类行为则可以使用多态。
OOP中使用类来提供封装,继承,多态三个特性。
例如,当我们需要向多个不相关类的某些现有行为添加通用的非业务逻辑时,我们需要计算一些业务方法的执行时间。过去,我们需要计算耗时的行为。编写计算耗时的代码。在OOP中,分散在多个不涉及业务的类中的代码称为跨领域代码。这种方法在OOP中的缺点是会影响业务逻辑行为。计算耗时的代码干扰(业务逻辑行为应仅针对业务),第二个缺点是无法重复使用计算耗时的代码。
在AOP中,模块化单元是方面(Aspect),它将影响多个类的常见行为封装到可重用模块中,然后您可以决定何时拦截哪些类的行为(切点),并使用行为(通知)在封装的可重用模块中,以增强其拦截的业务行为,而无需修改业务模块的代码。该方面是对此的抽象描述。
AOP中有以下基础概念:
Joinpoint(连接点):程序执行期间的某一个点,例如执行方法或处理异常时候的点。在SpringAOP中,连接点总是表示方法的执行。
Advice(通知):通知是指一个切面在特定的连接点要做的事情。通知分为方法执行前通知,方法执行后通知,环绕通知等。许多AOP框架(包括Spring)都将通知建模为拦截器,在连接点周围维护一系列拦截器(形成拦截器链),对连接点的方法进行增强。
Pointcut(切点):一个匹配连接点(Joinpoint)的谓词表达式。通知(Advice)与切点表达式关联,并在切点匹配的任何连接点(Joinpoint)(例如,执行具有特定名称的方法)上运行。切点是匹配连接点(Joinpoint)的表达式的概念,是AOP的核心,并且Spring默认使用AspectJ作为切入点表达式语言。
Aspect(切面):它是一个跨越多个类的模块化的关注点,它是通知(Advice)和切点(Pointcut)合起来的抽象,它定义了一个切点(Pointcut)用来匹配连接点(Joinpoint),也就是需要对需要拦截的那些方法进行定义;它定义了一系列的通知(Advice)用来对拦截到的方法进行增强;
Targetobject(目标对象):被一个或者多个切面(Aspect)通知的对象,也就是需要被AOP进行拦截对方法进行增强(使用通知)的对象,也称为被通知的对象。由于在AOP里面使用运行时代理,所以目标对象一直是被代理的对象。
AOPproxy(AOP代理):为了实现切面(Aspect)功能使用AOP框架创建一个对象,在Spring框架里面一个AOP代理要么指JDK动态代理,要么指CgLIB代理。
Weaving(织入):是将切面应用到目标对象的过程,这个过程可以是在编译时(例如使用AspectJ编译器),类加载时,运行时完成。SpringAOP和其它纯JavaAOP框架一样,是在运行时执行植入。
Advisor:这个概念是从Spring1.2的AOP支持中提出的,一个Advisor相当于一个小型的切面,不同的是它只有一个通知(Advice),Advisor在事务管理里面会经常遇到,这个后面会讲到。
相比OOP,AOP有以下优点:
业务代码更加简洁,例如当需要在业务行为前后做一些事情时候,只需要在该行为前后配置切面进行处理,无须修改业务行为代码。
切面逻辑封装性好,并且可以被复用,例如我们可以把打日志的逻辑封装为一个切面,那么我们就可以在多个相关或者不相关的类的多个方法上配置该切面。
相关推荐:【鲁班学院】java高级培训-能懂系列之Map详解