spring?IOC控制反轉原理詳解
IOC概念
- 定義:控制反轉,把對象的創(chuàng)建和調(diào)用(傳統(tǒng)方式是通過new之后直接使用對象),交給Spring進行管理(依靠對象工廠通過注入的方式獲取對象)
- 降低耦合度
- 底層原理:xml解析、工廠模式、反射
補:工廠模式和單例模式區(qū)別
單例模式(懶漢式,餓漢式)都只能創(chuàng)建一個指定類的唯一對象
工廠模式(一個接口,多態(tài)性的體現(xiàn))可以創(chuàng)建該接口的工廠下的所有類的唯一對象
IOC接口——實現(xiàn)IOC容器
IOC容器可以有多個,new幾個就有幾個IOC容器,一個容器綁定一個xml文件,一個xml中可以配置多個bean,容器可以關閉
1.BeanFactory
- Spring的內(nèi)部接口,不建議開發(fā)者使用
- 懶漢式,加載配置文件的時候不創(chuàng)建對象
2.ApplicationContext
- BeanFactory的子接口
- 功能更強大,建議開發(fā)者使用
- 餓漢式,加載配置文件即創(chuàng)建對象
- 由于創(chuàng)建對象會耗費時間和資源,因此餓漢式可以把時間開銷放在項目啟動時
第三個是基于注解的獲取容器方式,利用反射而非解析xml配置
SpringBoot中獲取ApplicationContext的三種方式
1.@Autowired: 在任意被spring托管的類中注入
2.ApplicationContextAware接口:實現(xiàn)這個接口可以在普通類中獲取Spring的IOC容器
IOC操作管理Bean
xml配置bean
在bean.xml中配置了bean的屬性后,先解析xml得到IOC接口對象(IOC容器),然后通過容器來getBean,獲得對象
同時,ApplicationContext也可以換成其父接口BeanFactory,結果不受影響
DI:依賴注入(注入屬性)
兩種方法
set方法+property
有參構造+constructor
工廠Bean和普通Bean
注解配置bean
注冊Bean
以下5個注解都可以創(chuàng)建Bean對象交給Spring的IOC容器進行管理
- @Component:以下4個的元注解
- @Service
- @Controller
- @Repository
- @Configuration
因為元注解Component可以指定value=“別名”,所以以上5種注冊Bean的方式都可以起別名,一個接口多個實現(xiàn)類Bean的情況需要起別名,否則Spring無法判斷獲取哪個Bean
使用Bean
- @Autowired:根據(jù)類自動裝配
- @Qualifier:根據(jù)別名裝配,要和@Autowired搭配使用
- @Resource:即可根據(jù)類也可根據(jù)別名
- @Value:注入普通類型屬性
Bean的配置
作用域:如何設置bean的單例or多例
scope屬性值:(常用singleton和prototype)
- singleton:默認值,單例對象,餓漢式
- prototype:多實例對象,懶漢式
- request請求、session會話:不常用
在bean.xml中或者@Bean(scope="")中配置
生命周期:創(chuàng)建到銷毀
1.無參構造
2.調(diào)用set方法解析配置
3.調(diào)用bean的初始化方法
如果有配置了初始化方法,需要配置init-method=“初始化方法的名稱”
例如:在@Bean(initmethod=“xxx方法”)
4.獲取bean并使用
注解方法可以直接@Autowired注入bean,配置xml的方式通過
new ClassPathXmlApplicationContext(xxxx.xml)解析并獲取IOC容器之后getBean
5.bean的銷毀與銷毀時方法
springboot中的bean創(chuàng)建與銷毀
銷毀方法的配置@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
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
詳解JavaScript中的函數(shù)聲明和函數(shù)表達式
這篇文章主要介紹了詳解JavaScript中的函數(shù)聲明和函數(shù)表達式,是JS入門學習中的基礎知識,需要的朋友可以參考下2015-08-08華為鴻蒙系統(tǒng)應用開發(fā)工具 DevEco Studio的安裝和使用圖文教程
HUAWEI DevEco Studio 是華為消費者業(yè)務為開發(fā)者提供的集成開發(fā)環(huán)境(IDE),旨在幫助開發(fā)者快捷、方便、高效地使用華為EMUI開放能力。這篇文章主要介紹了華為鴻蒙系統(tǒng)應用開發(fā)工具 DevEco Studio的安裝和使用圖文教程,需要的朋友可以參考下2021-04-04Java內(nèi)存溢出的幾個區(qū)域總結(注意避坑!)
內(nèi)存溢出是指應用系統(tǒng)中存在無法回收的內(nèi)存或使用的內(nèi)存過多,最終使得程序運行要用到的內(nèi)存大于虛擬機能提供的最大內(nèi)存,下面這篇文章主要給大家介紹了關于Java內(nèi)存溢出的幾個區(qū)域,總結出來給大家提醒注意避坑,需要的朋友可以參考下2022-11-11dubbo服務引用之創(chuàng)建Invoker流程詳解
這篇文章主要為大家介紹了dubbo服務引用二之創(chuàng)建Invoker流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08