spring IOC控制反轉原理詳解
IOC概念
- 定義:控制反轉,把對象的創建和調用(傳統方式是通過new之後直接使用對象),交給Spring進行管理(依靠對象工廠通過註入的方式獲取對象)
- 降低耦合度
- 底層原理:xml解析、工廠模式、反射
補:工廠模式和單例模式區別
單例模式(懶漢式,餓漢式)都隻能創建一個指定類的唯一對象
工廠模式(一個接口,多態性的體現)可以創建該接口的工廠下的所有類的唯一對象
IOC接口——實現IOC容器
IOC容器可以有多個,new幾個就有幾個IOC容器,一個容器綁定一個xml文件,一個xml中可以配置多個bean,容器可以關閉
1.BeanFactory
- Spring的內部接口,不建議開發者使用
- 懶漢式,加載配置文件的時候不創建對象
2.ApplicationContext
- BeanFactory的子接口
- 功能更強大,建議開發者使用
- 餓漢式,加載配置文件即創建對象
- 由於創建對象會耗費時間和資源,因此餓漢式可以把時間開銷放在項目啟動時
第三個是基於註解的獲取容器方式,利用反射而非解析xml配置
SpringBoot中獲取ApplicationContext的三種方式
1.@Autowired: 在任意被spring托管的類中註入
2.ApplicationContextAware接口:實現這個接口可以在普通類中獲取Spring的IOC容器
IOC操作管理Bean
xml配置bean
在bean.xml中配置瞭bean的屬性後,先解析xml得到IOC接口對象(IOC容器),然後通過容器來getBean,獲得對象
同時,ApplicationContext也可以換成其父接口BeanFactory,結果不受影響
DI:依賴註入(註入屬性)
兩種方法
set方法+property
有參構造+constructor
工廠Bean和普通Bean
註解配置bean
註冊Bean
以下5個註解都可以創建Bean對象交給Spring的IOC容器進行管理
- @Component:以下4個的元註解
- @Service
- @Controller
- @Repository
- @Configuration
因為元註解Component可以指定value=“別名”,所以以上5種註冊Bean的方式都可以起別名,一個接口多個實現類Bean的情況需要起別名,否則Spring無法判斷獲取哪個Bean
使用Bean
- @Autowired:根據類自動裝配
- @Qualifier:根據別名裝配,要和@Autowired搭配使用
- @Resource:即可根據類也可根據別名
- @Value:註入普通類型屬性
Bean的配置
作用域:如何設置bean的單例or多例
scope屬性值:(常用singleton和prototype)
- singleton:默認值,單例對象,餓漢式
- prototype:多實例對象,懶漢式
- request請求、session會話:不常用
在bean.xml中或者@Bean(scope="")中配置
生命周期:創建到銷毀
1.無參構造
2.調用set方法解析配置
3.調用bean的初始化方法
如果有配置瞭初始化方法,需要配置init-method=“初始化方法的名稱”
例如:在@Bean(initmethod=“xxx方法”)
4.獲取bean並使用
註解方法可以直接@Autowired註入bean,配置xml的方式通過
new ClassPathXmlApplicationContext(xxxx.xml)解析並獲取IOC容器之後getBean
5.bean的銷毀與銷毀時方法
springboot中的bean創建與銷毀
銷毀方法的配置@Bean(destroyMethod = “xxxxx”)
如果是配置在xml中,則
<bean id=" " class=" " destroy-method=" "></bean>
xml配置的Bean的關閉:關閉IOC容器即可
Bean掃描
spring中xml配置
spring和springboot中的註解配置
@ComponentScan
- 被Component及其子註解標註的Bean需要用ComponentScan掃描到才能使用
- SpringBootApplication啟動類包括瞭@ComponentScan
- @ComponentScan默認掃描該類包下的所有Bean
- @ComponentScan可以自定義basePackages、includeFilters、excludeFilters
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- Spring的IOC控制反轉詳解
- 詳解SpringIOC容器中bean的作用范圍和生命周期
- 一文搞懂Spring Bean中的作用域和生命周期
- Java Spring中Bean的作用域及生命周期
- Spring Bean作用域與生命周期深入講解