Spring Security 實戰乾貨:分散式物件SharedObject
阿新 • • 發佈:2021-01-28
![](https://img2020.cnblogs.com/other/1739473/202101/1739473-20210128093652904-1787730647.jpg)
## 1. 前言
在[上一篇](https://felord.cn/authenticationConfiguration.html)我們對`AuthenticationManager`的初始化的細節進行了分析,其中裡面有一段程式碼引起了不少同學的注意:
```java
ApplicationContext context = http.getSharedObject(ApplicationContext.class);
CaptchaAuthenticationProvider captchaAuthenticationProvider = context.getBean("captchaAuthenticationProvider", CaptchaAuthenticationProvider.class);
```
上面直接從`HttpSecurity`物件中獲取到**Spring**的應用上下文物件`ApplicationContext`,它是怎麼做到的呢?**SharedObject**又是個什麼概念?今天就來搞清楚這個問題。
## 2. SharedObject
> 在**Spring Security**中**SharedObject**既不是物件也不是介面,而是某一類“可共享”的物件的統稱。
顧名思義,**SharedObject**的意思是可共享的物件。它的作用是如果一些物件你希望在不同的作用域配置中共享它們就把這些物件變成**SharedObject**,有點分散式物件的感覺。為了更加便於你理解,下面是相關的體系結構:
![配置類的組織架構](https://img2020.cnblogs.com/other/1739473/202101/1739473-20210128093653133-1306089069.png)
`AbstractConfiguredSecurityBuilder`或者`HttpSecurityBuilder`的實現類才具有操作**SharedObject**的能力。一種是註冊**SharedObject**,另一種是獲取**SharedObject**。
### SharedObject的註冊
**SharedObject**會以其`Class`型別為`Key`,例項為`Value`儲存到一個