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:註入普通類型屬性

兩個String實現Bean,起別名

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的更多內容!    

推薦閱讀: