面对表面编程是将杂交逻辑封装到切割表面中,并且AOP容器的功能用于将切割表面植入主要的业务逻辑中。SO所述的“交叉 - 企业”是指通常通用的代码与主要业务逻辑无关。例如:日志信息,安全检查,交易,缓存,设置字符编码,文本消息等。
如果您不使用AOP。将有一个编码纠缠。不重要的业务功能和重要的业务功能代码混合在一起,使整个程序的结构感到困惑。
例如,转移函数。在实际转移业务逻辑之前和之后主要业务逻辑。但是它们的代码量可以达到代码总数的一半或更多!它们的存在不仅产生了大量的“冗余”代码,而且还极大地干扰了主要业务逻辑的结构-Transfer
注意:AOP是面向对象的编程的补充
(添加)
切割表面是指交叉逻辑。上述交易处理,日志功能等可以理解为切割表面,常用的切割表面是通知(建议)(也可以理解为切割的时间点进入目标代码)。
它实际上是对主要业务逻辑的增强
连接点是指切开表面可以植入的特定方法。通常,业务接口中的方法是连接点
入口点是指声明的一个或多个连接点的收集。输入点指定的一组方法。
注意:标记为最终的方法不能用作连接点和输入点,因为无法修改或增强最终方法。
目标对象是指增强对象,即包含主要业务逻辑的类的对象。例如,如果增强了StudentserViceImpl的对象,则该类称为目标类,称为目标对象。你不能增强,没关系
通知表明切割表面的执行时间也称为增强。例如:MyInsvocationHandler可以理解为通知。
从另一个角度来看,通知增强代码的时间点要切入目标代码:是在执行目标方法之前执行还是执行目标方法...
通知的类型是不同的,切入的时间不同。入口点定义了条目的位置,通知定义了切割时间
定义切割表面方面后,应通知弹簧容器,以允许容器生成“目标” +“切割表面”的代理对象。该代理是由容器自动生成的。spring配置文件中的extictj。
AOP:AntionawectjautoproxyCreator实现了AspectJ-Autoproxy的底层。
从名称可以看出,它基于aptive j的注释以适应自动代理生成器
它的工作原理是AOP:apcipj-autoproxy找到由@Aspect定义的切割表面,然后根据切口表达式找到目标类的目标方法,然后找到通知类型的时间点。
在执行目标方法之前,执行了@Before标记的方法。在Pre -notification前面通知的方法可以包含JoinPoint类型的参数。此类型的对象本身是入口点的表达式。此参数,您可以获取入口点,方法签名,目标对象等的表达式。
补充:不仅可以包含Joinpoint类型参数的预定方法,所有通知方法都可以包括JOINPOINT参数
@AferReturn注释标记的方法应在执行目标方法后通知后部并执行。
因为它是在目标方法之后执行的,因此可以获取目标方法的返回值。该注释的返回属性是指定接收方法的返回值的变量名称。(此参数用于指定变量名称,此变量名称表示该方法的返回值)
因此,除了后方通知的方法外,除了Joinpoint参数外,它还可以包括用于接收返回值参数并进行修改的变量。此变量最好使用对象类型,因为返回值目标方法可以是任何类型。
定义接口和实现类
定义切割表面的方法
在目标方法执行之前和之后执行以@aroundproceedjoinpoint标记的增强方法。周围通知方法的注释必须具有返回值,对象类型。该方法可以包含processingjoinpoint类型的参数。()接口中的方法在RogeingJoinPoint中执行目标方法。
如果目标方法具有返回值,则此方法的返回值是目标方法的返回值。
最后,对备份方法的返回值实际上是拦截了目标方法的实现
定义接口和实现类
定义切割
在异常抛出目标方法后,执行以@After的标记的方法。注释的抛出属性用于指定发生的异常对象。当然,注释作为异常通知的方法可以包含可投掷的标准,并且可以包含一个参数可投掷,并且参数名称是通过投掷指定的名称,它指示发生的异常对象。
定义接口和实现类
定义
无论目标方法是否异常抛出,都将执行增强功能
定义接口和实现类
定义
当更多的通知增强方法使用相同的执行输入点表达式时,写作和维护更加麻烦。ASPECTJ提供@pointCut注释来定义执行输入点表达式。
用法:@PointCut注释高于一种方法。将来,所有执行的值属性都可以用作入口点。它表示由@PointCut定义的输入点。
这种使用@PointCut注释的方法通常使用私人徽标方法,也就是说,没有实用方法。
原始:https://juejin.cn/post/7096780005295783973