当前位置: 首页 > 图灵资讯 > 技术篇> 面向切面编程AOP之深入了解

面向切面编程AOP之深入了解

来源:图灵教育
时间:2023-06-12 09:23:44

1.先导103

物联网使软件组件松耦合。AOP允许您捕捉系统中常用的功能,并将其转化为组件。

AOP(AspectOrientedProgramming):面向切面编程,面向方面编程。(AOP是一种编程技术)

AOP是OOP的补充延伸。

AOP底层采用动态代理实现。

SpringAOP使用的动态代理是:JDK动态代理+CGLIB动态代理技术。Spring在这两个动态代理中灵活切换。如果是代理接口,默认会使用JDK动态代理。如果要代理某个类别,这个类别不实现接口,就会切换CGLIB。当然,你也可以通过一些配置强制Spring只使用CGLIB。

2.AOP介绍103

一般来说,系统中会有一些系统服务,如日志、事务管理、安全等。这些系统服务被称为:交叉业务

这些交叉业务无论是转账银行账户还是删除用户数据,几乎都是通用的。日志、事务管理、安全等都需要做。

若在每个业务处理过程中,都掺杂了这些交叉业务代码,则存在两个问题:

●第一:交叉业务代码在多个业务流程中反复出现。显然,交叉业务代码尚未重复使用。如果修改这些交叉业务代码,则需要修改许多地方。

●二是程序员不能专注于核心业务代码的编写,在编写核心业务代码时需要处理这些交叉业务。

使用AOP可以很容易地解决上述问题。

请参见下图,可以帮助您快速理解AOP的想法:

面向切面编程AOP之深入了解_面向切面编程

用一句话总结AOP:独立提取与核心业务无关的代码,形成独立组件,然后水平交叉应用于业务流程的过程称为AOP。

AOP的优点:

●一是代码复用性增强。

●二是代码易于维护。

●三是让开发者更加注重业务逻辑。

3.AOP的七个术语104

public class UserService{    public void do1(){        System.out.println("do 1");    }    public void do2(){        System.out.println("do 2");    }    public void do3(){        System.out.println("do 3");    }    public void do4(){        System.out.println("do 4");    }    public void do5(){        System.out.println("do 5");    }    // 核心业务方法    public void service(){        do1();        do2();        do3();        do5();    }}

3.1连接点Joinpointointtinttt

连接点描述位置

○在程序的整个执行过程中,可以织入切面的位置。方法执行前后,异常抛出后等位置。

3.2切点Pointcutcut

切点本质上是一种方法(真正编织切面的方法称为切点)

○在程序执行过程中,真正织入切割方法。(一个切点对应多个连接点)

3.3.3通知Advicece

○通知,也被称为增强,是你想编织的代码。

○通知包括:

■前置通知

■后置通知

■环绕通知

■异常通知

■最终通知

3.4切面Aspecttect

○切点+通知是切面。

3.5编织Weaving

○将通知应用到目标对象上的过程。

3.6代理对象Proxyyy

○将目标对象编织成通知后产生的新对象。

3.7目标对象Targetttet

○被编织成通知的对象。

通过下图,您可以很好地理解AOP的相关术语:

面向切面编程AOP之深入了解_AOP_02

4.切点表达式105

切点表达式用于定义通知(Advice)切入哪些方法?

切入点表达式语法格式:

execution([访问控制权限修饰符] 返回值类型 方法名(形式参数列表)[全限定类名] [异常])

4.1访问控制权限修饰符:

●可选项。

●不写,就是包括四个权限。

●写public意味着只包括公开方法。

4.2返回值类型:

●必填项。

●*任意类型的返回值表示。

4.3全限定类名:

●可选项。

●两个点..代表当前包和子包下的所有类别。

●省略时表示所有类别。

4.4方法名:

●必填项。

●*表示所有方法。

●set*表示所有的set方法。

4.5形式参数列表:

●必填项

●()表示没有参数的方法

●(..)参数类型和随机数量的方法

●(*)只有一个参数的方法

●(*,String)第一个参数类型是随机的,第二个参数是String。

4.6异常:

●可选项。

●省略时表示任何异常类型。

了解以下切点表达式:

execution(public * com.powernode.mall.service.*.delete*(..))

execution(* com.powernode.mall..*(..))

execution(* *(..))