1.主動獲取Bean
?spring項目在需要時,會自動從IOC容器中獲取需要的Bean
我們也可以自己主動的得到Bean對象?
(1)獲取bean對象,首先獲取SpringIOC對象
private ApplicationContext applicationContext? ?//IOC容器對象?
(2 )方法1:根據名稱獲取bean
創建bean對象,沒有指定名稱時,默認就是 bean的名稱 就是?類名的首字母小寫
直接獲取得到的是Object對象,需要強轉
三次運行都只得到一個Bean,說明Bean對象默認是單例的
2.bean的作用域:(知道這兩種就行了)
單例的:容器內只有一個單例的Bean
非單例的:每次使用都創建新的bean
下面三種只在web環境中才有,不重要
可以通過@Lazy來延遲加載bean,只有第一次使用時,才會初始化這個bean。(使用不多)
3.第三方bean的配置
我們聲明自己的bean對象是用這幾個注解,自己的bean對象就是自己寫的類,將自己的bean對象交給IOC容器管理,加上這幾個注解及其衍生注解
場景:
dem4j是用來解析xml文件的,
我們想要用的話,第一步,先在pom中加入這個dom4j這個依賴
第二步,可以在類中new一個SAXReader對象,然后調用方法就可以使用了
但是我們都是用Spring框架了,這樣使用太麻煩了,我們可以把SAXReader交給IOC容器去管理,每次用的時候,直接注入就好了。但是發現SAXReader類并沒有加上@component注解生成bean對象,且是只讀文件,我們也加不了
所以,我們使用第三方的bean對象,就不能像之前的做法,直接在類上加@component注解生成bean對象了
解決方法:使用第三方的bean
在啟動類上加上一個方法(方法名就是第三方類交給IOC管理的bean對象的bean的默認名稱),方法返回值(這個類的對象)交給IOC容器管理,成為bean對象。
這個方法必須加上@Bean注解
這樣,在其他地方使用這個對象,使用@Autowired注入進來就可以了
和main方法是平行的
但是呢?如果都加到啟動類中,啟動類就變復雜了,要保證啟動類的純潔,不建議加在啟動類中寫多余的代碼
我們建議在配置類(@Configration)中聲明這樣一個類,集中管理第三方的bean注入。
在配置類上加上一個方法(方法名是隨意的),方法返回值(這個類的對象)交給IOC容器管理,成為bean對象。如果有多個第三方的bean,再定義一個方法,重復這個過程,就可以了
驗證:方法名就是 IOC容器中bean的名稱
測試:通過主動獲取bean對象方法,通過bean的名稱獲取bean對象,看看能不能獲取到?
獲取到了,說明? 方法名就是 IOC容器中bean的名稱
注入第三方bean的時候,如何解決依賴注入的問題?寫到形參里就可以了
場景:如果我們在注入第三方bean(SAXReader)的時候,SAXReader還依賴DeptService的bean,怎么辦?
只需要把DeptService放到形參的位置,spring就會自動注入DeptService的bean以幫助我們注入第三方bean(SAXReader)
不需要@Autowired手動裝配
總結:
(1)如果是自己定義的類,想交給IOC容器管理,就是用@Component注解及其衍生注解
(2)如果是引入第三方的類,想交給IOC容器管理,,并且源碼中沒有加@Component注解,源碼文件又只讀不可寫,我們也加不了,就要使用@Bean注解,放到配置類中,交給IOC容器管理