bean:最近在寫一篇讓Successfactors顧問都能搞明白的sso的邏輯的文章,所以一致在研究IAS的saml2.0的協議,希望用代碼去解釋SP、idp的一些概念,讓顧問了解SSO與saml的關系,在github找代碼的時候發現一些代碼的調用關系很難理解,今天上課的時候正好需要說到一個知識點,所以希望通過這篇文章去介紹@Bean這個注解的含義。
一 bean的含義
Spring定義Bean的兩種方式:<bean>和@Bean,這兩種都是去實例化對象的
我們先看XML的bean
然后看@bean注解
通過上面兩個圖,我們可以看出,這兩個是一個意思,只是不同的實現方式而已。
二 分析smal2.0代碼
在看github的有一個人寫的代碼的時候,發現JKSKeyManager keyManager沒有實例化就被引用,因為一致以為@bean注解,類就會交給容器管理,如果需要注入就需要用注解@autowire才可以,所以一致沒看明白,正好今天上課的時候說注入外部bean的時候,讓恍然大戶,其實這就是一個典型的通過@Bean注解注入的例子,
SamlMessageHandler samlMessageHandler實例化的時候,容器會檢查
JKSKeyManager keyManage是否被容器接管,如果結果就會自動注入。所以使用JKSKeyManager keyManage的時候不需要@autowire。
三 簡單例子驗證
現在我們就用UserDao與UserService兩個類來演示,首先我們來看UserDao這個類,這類就是一個簡單的空架子,我在類上面也沒有用注解@Repository。
然后我們在看UserService這個類,這個類也沒有加上@Service注解,所以如果沒有new,按道理是不會實例化。
現在我配置Config的配置類,這個類上面我有一個注解@Configuration,目的就是用全注解開發,在這個類里面我定義兩個bean,注意我們看第二個bean的方法參數里面是UserDao的類,但是我們沒有在UserDao類上面使用任何注解,這個時候就會有個疑問,為什么17行不會是空指針。原因很簡單,就是在下下圖的getbean實例化UserService的時候,系統發現UserDo沒有實力,系統就回去找第9行的@Bean代碼.就是我們bean注入外部bean的概念。