1

A-O-P 一篇概览 - WindWant

 1 year ago
source link: https://www.cnblogs.com/niejunlei/p/13237130.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一、什么是AOP?

AOP 即 Aspect-oriented Programming,Aspect 切面,什么是切面,就是一条大路上的收费站,检查站,首先它是一个统一的功能单元,或是收费、或是检查,其次它可以决定对谁收费,对谁收多少费,对谁检查。与之相对的是 OOP 即 Object-oriented Programming,Object 对象,对象就是大路上的一辆辆汽车,每辆汽车都有一套完成的功能系统,有发动机、车架、车轮、方向盘等,每辆车又各自不同,或是小轿、或是SUV、又或是货车等等,AOP 是对 OOP 的补充,是程序结构涉及的一种方式。

二、核心概念

  • Aspect:模块化的关注点(切面),例如事务。通常以 @Aspect 注解类形式应用。一个小容器

    package com.xyz;
    import org.aspectj.lang.annotation.Aspect;
    @Aspect
    public class NotVeryUsefulAspect {
    }
  • Join point::程序执行过程中的一个点,例如一个方法,或者一个异常处理。Spring AOP 中,通常代表一个方法的执行。在何处执行。

    @Before("execution(* com.xyz.dao.*.*(..))")
    public void doAccessCheck(<strong>JoinPoint jp</strong>) {
    // ...
    }

    可以通过 JointPoint 获取执行点的一系列数据:

    • getArgs():方法参数。

    • getThis():返回代理对象。

    • getTarget():返回被代理的对象。

    • getSignature():方法描述。

  • Advice:在 joint point 处需要执行的操作。包括 "around"、"before" 及 "after" 等。advice 通常会被模块化为拦截器,多个 advices 以拦截器链的形式作用于 joint point。执行什么。

    @After("execution(* com.xyz.dao.*.*(..))")
    public void doAccessCheck() {
    // ...
    }

    关于 advice 顺序:
    spring aop 中定义顺序:@Around、@Before、@After、@AfterReturning、@AfterThrowing
    应用 AspectJ 则遵从 @After 作为最终执行顺序,于 @AfterReturning、@AfterThrowing 之后执行。
    同一个 joint point 处的同类 advice 以 @Order 执行执行顺序。

  • Pointcut:用以匹配 joint point 的断言,可以称之为代表一系列 joint point。结合 Advice 使用。匹配何处执行语义。

    @Pointcut("execution(public * *(..))")
    public void publicMethod() {}
    Pointcut 使得 advice 可以作用于目标对象,同时又独立于对象,是实现面向切面的关键概念。
  • Target object:advices 执行的目标对象。代理对象。

  • AOP proxy:代理,用以实现切面合约。JDK动态代理或者CGLIB 代理。

  • Weaving:织入,将切面和其它应用对象链接在一起来创建执行对象。组装。

三、能力和目标

Spring AOP 目前只支持方法级别的 joint point(spring bean 中的方法),如果需要其它粒度,如属性字段,可以使用 AspectJ。

Spring AOP 没有实现完整的 AOP 功能,它的出现旨在整合 AOP 功能和 Spring IoC 容器,用以解决企业实际应用中常见的问题。

Spring AOP 和 AspectJ 并非竞争关系,它们各自都是非常成熟的框架,适用于不同的目的。Spring 可以在基于 Spring 框架的应用架构中无缝整合 Spring AOP、IoC 及 AspectJ,以完整地使用 AOP 功能。

Spring AOP 是基于代理的,默认使用 JDK 动态代理,用以实现接口代理。

非接口代理需要使用 CGLIB。 

五、AspectJ

1、AnnotationAwareAspectJAutoProxyCreator

603942-20200704233704988-321580621.png

ApplicationContext:入口。

AspectJAutoProxyBeanDefinitionParser:AspectJ 解析器,自动发现注册 AspectJ 风格的切面。

AnnotationAwareAspectJAutoProxyCreator 会根据定义的切点来自动代理相匹配的 bean。AnnotationAwareAspectJAutoProxyCreator 的层次结构如下:

603942-20200704155811015-319078450.png

AnnotationAwareAspectJAutoProxyCreator 实现了 BeanPostProcessor 接口,会在对应 Bean 实例化后应用此 BeanPostProcessor。

AnnotationAwareAspectJAutoProxyCreator 用于处理所有 AspectJ 声明的切面。

2、AspectJProxyFactory

基于 AspectJ 的代理工厂。可以用于编程方式创建包含切面的对象代理。

//创建代理工厂
AspectJProxyFactory factory = new AspectJProxyFactory(targetObject);
// 添加 AspectJ aspect,可以多次添加,可以使 class 或者 instance。
factory.addAspect(SecurityManager.class); //.addAspect(usageTracker);
// 获取对象代理
MyInterfaceType proxy = factory.getProxy();

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK