Solon v3.0.6

容器及内部结构

</> markdown

一般把驱动 Ioc/Aop 编程方式的 “容器”,称为:Ioc/Aop 容器。一般也叫:

  • Bean 容器(也有直接叫“容器”)
  • DI容器、注入依赖容器、注解容器
  • 应用容器

在 Solon 里,也称为:应用上下文,即 AppContext。主要由三大部分组件:

  • 对象存放单元
  • 能力登记单元
  • 处理驱动单元

1、AppContext 的对象存放单元(用于存放处理产生的对象)

对象存放单元说明
beanWrapsOfType存放,按类型哈希登记的对象包装器
beanWrapsOfName存放,按名字哈希登记的对象包装器
beanWrapSet存放,所有对象包装器

容器嘛,总要有存放的单位。托管对象在注册时,都会被存入 beanWrapSet。之后根据情况会再存入 beanWrapsOfName 和 beanWrapsOfType。

  • 按名字注册,则按名字注入、按名字获取、按名字检测
  • 按类型注册,则按类型注入、按类型获取、按类型检测(相同类型只注册一个;除非名字不同)

类型注册在自动装配时,也会同时注册 “申明类型” 与 “实例类型” 的一级实现接口类型。

2、AppContext 能力登记单元(用于登记各种扩展处理能力)

能力登记单元说明
beanBuilders存放,登记的“构建”能力(ioc 的源)
beanInjectors存放,登记的“注入”能力(ioc 的目标)
beanExtractors存放,登记的“提取”能力
beanInterceptors存放,登记的“拦截”能力(aop)

容器,像自动化流水线工厂。会有各种能力单元,比如要注入,比如要拦截。

3、AppContext 处理驱动单元(及生命周期接口)

处理驱动单元说明
beanHashSubscribersOfType存放,按类型哈希注入的订阅行为(处理时形成的)
beanHashSubscribersOfName存放,按名字哈希注入的订阅行为(处理时形成的)
beanBaseSubscribersOfType存放,按基类匹配注入的订阅行为(处理时形成的)
beanScan(...)对象扫描(大范围处理机制)
beanMake(...)对象制造(单类)
start()启动
stop()停止

AppContext 是通过能力登记后(非常开放的方式),再做处理驱动,最后通过生命周期接口进行处理校验(比如谁没有注入成功?)。以下仅为示意性演示:

AppContext context = new AppContext();

//1.登记能力
context.beanBuilderAdd(Controller.class, new ControllerBuilder());
context.beanInjectorAdd(Inject.class, new InjectInjector());
context.beanInterceptorAdd(Tran.class, new TranInterceptor());
context.beanExtractorAdd(CloudJob.class, new CloudJobExtractor());

//2.处理驱动
context.beanScan(App.class); //扫描 App 所在包下的所以类

//3.完成启动(会做一些校验等...)
context.start();

AppContext 是 Solon 的应用程序(SolonApp)最核心组成。也是应用程序启动过程的最核心处理部分。