一般把驱动 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 是通过能力登记后（非常开放的方式），再做处理驱动，最后通过生命周期接口进行处理校验（比如谁没有注入成功?）。以下仅为示意性演示：

```java
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）最核心组成。也是应用程序启动过程的最核心处理部分。

