一、什么是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(JoinPoint jp) {
    // ...
    }

    可以通过 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

ApplicationContext:入口。

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

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

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();

A-O-P 一篇概览的更多相关文章

  1. Java面试题之基础篇概览

    Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...

  2. [php入门] 4、HTML基础入门一篇概览

    [php入门] 1.从安装开发环境环境到(庄B)做个炫酷的登陆应用 [php入门] 2.基础核心语法大纲 [php入门] 3.WAMP中的集成MySQL相关基础操作 1.HTML的作用 HTML是超文 ...

  3. 全方位理解Android权限之底层实现概览

    0000 这个阶段搞了很多和Android文件权限相关的问题,虽然一知半解,但也算是对Android权限机制有一些自己的理解.遂将这些内容整理出来.因为权限这部分涉及到的内容很多,故将知识分为几块内容 ...

  4. jackson学习之十(终篇):springboot整合(配置类)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. JUnit5学习之八:综合进阶(终篇)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. OpenFaaS实战之九:终篇,自制模板(springboot+maven+jdk8)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. disruptor笔记之八:知识点补充(终篇)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. spring-cloud-square源码速读(retrofit + okhttp篇)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos spring-cloud-square系列文章 五分钟 ...

  9. Spring Cloud Gateway过滤器精确控制异常返回(分析篇)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 在<Spring Cloud Gate ...

  10. 支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos <支持JDK19虚拟线程的web框架>系列 ...

随机推荐

  1. [C#] Func及Action的快速Demo

    参考代码1: using System;using System.Collections.Generic;using System.Linq;namespace FuncActionDemo{    ...

  2. awk command

    https://www.cnblogs.com/bluevitality/p/6691041.html

  3. 微信公众号授权登录,整合spring security

    公司的业务需求,对接了微信公众号授权,通过微信公众号的接口拿到用户信息进行业务系统的登录,话不多说上代码,我的实现方式是整合了spingSecurity 首先是接口 @PostMapping(&quo ...

  4. Codeforces Round #809 (Div. 2) A-E

    Codeforces Round #809 (Div. 2) 2022/7/19 下午VP 传送门:https://codeforces.com/contest/1706 A. Another Str ...

  5. python tkinter Checkbutton的新增和清除 取值

    from tkinter import * root = Tk() name = StringVar() check_box_list = [] ent=Entry(root,textvariable ...

  6. USB TTL CMOS 电平

    USB转TTL模块的作用就是把电平转换到双方都能识别进行通信. TTL电平信号规定,+5V等价于逻辑"1",0V等价于逻辑"0"(采用二进制来表示数据时).这样 ...

  7. Spring源码分析之getBean

    一.前言 spring作为JAVAEE最核心的框架,是每一个java开发者所必须掌握的,非常重要,本篇从一个简单例子入手,由浅入深的分析spring创建bean的全过程,目标在于彻底搞懂spring原 ...

  8. 【chatQA】nvm包版本管理

    如何使用nvm来管理不同版本的 Node.js,然后使用不同的 Node.js 版本来运行不同版本的 React 应用? 要使用 nvm 来管理不同版本的 Node.js,可以按照以下步骤进行操作: ...

  9. Weak Encryption 弱加密安全问题处理

    Weak Encryption Abstract 程序使用了弱加密算法,无法保证敏感数据的保密性. Explanation 陈旧的加密算法(如 DES)再也不能为敏感数据提供足够的保护了. 加密算法依 ...

  10. KCL v0.4.6 alpha 发布!- 更多 Kubernetes 工具集成,更好的 IDE 错误提示

    简介 KCL 团队很高兴地宣布 KCL v0.4.6-alpha.1 版本现在已经可用! 您可以在 KCL v0.4.6-alpha.1 发布页面 或者 KCL 官方网站 获得 KCL 二进制下载链接 ...