容器及内部结构
一般把驱动 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)最核心组成。也是应用程序启动过程的最核心处理部分。