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