美文网首页
设计 IOC 和 AOP

设计 IOC 和 AOP

作者: 放开那个BUG | 来源:发表于2021-01-30 14:58 被阅读0次

    1、前言

    对于 Spring 都 IOC 跟 AOP 的概念想必大家都很熟悉,但 IOC、AOP 不只是局限于 Spring。duboo 自己也实现了 IOC 的概念,使用一个容器管理 bean 的生命周期。而 AOP 也不是 spring 才有运用,完全实现 AOP 概念的是 Aspectj 语言,只是 spring 只用于他的表达式匹配而已,而没有引入另外一门语言(增加学习成本)。

    AOP 是一种编程概念,实现技术有动态代理、cglib 代理。jdk 动态代理只能代理接口,而 cglib 代理主要是通过继承来实现。我认为 AOP 比较重要有这几个概念:

    • 切入点:主要切哪里,根据表达式来定位
    • 表达式:定义需要切的地方,跟正则表达式功能类似
    • 通知:前置通知、后置通知、环绕通知等,定义切的时候的行为,比如前置通知是在方法执行之前需要做啥,以此类推

    2、设计

    工程来自于:https://github.com/code4craft/tiny-spring/tree/master

    作者实现了一个比较完整的小型的 IOC、AOP 容器,可以去围观一波。它主要的流程如下:

      1. ApplicationContext 完成了类定义的读取和加载,并注册到 BeanFactory 中去。
      1. ApplicationContext 从 BeanFactory 中寻找 BeanPostProcessor,注册到 BeanFactory 维护的 BeanPostProcessor 列表中去。
      1. ApplicationContext 以单例的模式,通过主动调用 getBean 实例化、注入属性、然后初始化 BeanFactory 中所有的 Bean。由于所有的 BeanPostProcessor 都已经在第 2 步中完成实例化了,因此接下来实例化的是普通 Bean,因此普通 Bean 的初始化过程可以正常执行。
      1. 调用 getBean 时,委托给 BeanFactory,此时只是简单的返回每个 Bean 单例,因为所有的 Bean 实例在第三步都已经生成了。

    看工程的时候,只需要看 ApplicationContextTest 即可,它是主要的入口,封装了一切调用。

    IOC 容器实现比较简单,就是 xml 中定义好 bean,然后在程序中解析注入 beanFactory 即可。对于 AOP,使用了 jdk 动态代理、cglib 动态代理实现,在匹配哪些类需要被代理时,使用了 aspectj 的表达式匹配方法。

    3、参考资料

    https://www.zybuluo.com/dugu9sword/note/382745

    相关文章

      网友评论

          本文标题:设计 IOC 和 AOP

          本文链接:https://www.haomeiwen.com/subject/aztktltx.html