思來想去!可能與 Solon 容器的獨立設計有一定關係。
1、Solon 註解容器的運行特點
- 有什麼註解要處理的(註解能力被規範成了四種),提前註冊登記
- 全局只掃描一次,並在掃描過程中統一處理註解相關
- 掃描注入時,目標有即同步注入,沒有時則訂閱注入
- 自動代理。即自動發現AOP需求,並按需動態代理
2、內部結構示意圖
3、支持四種註解能力的處理對象:
對象 | 說明 |
---|---|
BeanBuilder | 構建器(比如:@Component 註解,如果沒有註冊此註解的構建器,則會無視) |
BeanInjector | 注入器(比如:@Inject、@Db、@CloudConfig、@VaultInject) |
BeanExtractor | 提取器(比如:@Scheduled、@CloudJob) |
BeanInterceptor | 攔截器(比如:@Tran、@Cache) |
Solon Aop 的具體表象:即爲註解處理,原則上需要提前埋好切點(不支持表達式 Aop)。開發及應用可見《四種自定義註解開發彙總》
4、關於自動代理
當一個組件(即 @Component
註解的類),其函數上的註解有對應的攔截處理時(即有 AOP 的需求)。此組件會啓用動態代理。關於代理,可參考《動態代理的本質》。v2.5.3 後支持
5、容器處理的補充
- 比如有些需要拼裝的活,可以交給配置器("@Configuration" 註解的類)去處理
- 或者需要初始化的活,交給生命週期的類("LifecycleBean" 接口實現的組件或 "@Init" 註解函數)去處理
- 再可藉助 事件總線 + 應用生命週期 做些事情