日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

大话spring~spring那些事

發(fā)布時(shí)間:2023/12/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话spring~spring那些事 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說(shuō)到這個(gè)spring,首先要搞清楚沒(méi)有spring之前我們是什么樣子的哈

a、很多設(shè)計(jì)模式需要自己去整合b、所有的封裝、繼承、多態(tài)、增強(qiáng)、依賴、模塊管理等等工作都需要自己制定統(tǒng)一的規(guī)則c、所有的創(chuàng)建對(duì)象、配置依賴關(guān)系、資源的重復(fù)利用都需要我們手動(dòng)去搞

我滴個(gè)天,看著都累、這的做多少重復(fù)的工作。人是懶惰的,不想重復(fù)造輪子呀,所以Spring出現(xiàn)了,Java程序員的春天真的來(lái)了,解放了

細(xì)節(jié)來(lái)了,spring做了什么?讓 Java Bean能夠?qū)崿F(xiàn)無(wú)縫對(duì)接、閉上眼睛幻想一下,有沒(méi)有這么一個(gè)東西、我們的所有bean 初始化就都準(zhǔn)備好了,只是存在一個(gè)地方、用的時(shí)候就自動(dòng)來(lái)了~正所謂召之即來(lái)。想想都香、簡(jiǎn)直是人工智能。

幸運(yùn)的是,spring就做到了。這個(gè)得益于spring的IOC容器,ioc小名bean工廠,在具體點(diǎn)就是一個(gè)(Map容器–ps:實(shí)際存在 ConcurrentHashMap)、緩存bean 的地方。這么搞得優(yōu)點(diǎn)顯而易見(jiàn),時(shí)刻在內(nèi)存中放著、用的時(shí)候不需要臨時(shí)創(chuàng)建,速度那是杠杠的~
用抽象點(diǎn)的語(yǔ)言描述:

1、IOC(Inversion of Control)控制反轉(zhuǎn):所謂控制反轉(zhuǎn),就是把原先我們代碼里面需要實(shí)現(xiàn)的對(duì)象創(chuàng)建、依賴的代碼,反轉(zhuǎn)給容器來(lái)幫忙實(shí)現(xiàn)。那么必然的我們需要?jiǎng)?chuàng)建一個(gè)容器,同時(shí)需要一種描述來(lái)讓容器知 道需要?jiǎng)?chuàng)建的對(duì)象與對(duì)象的關(guān)系。這個(gè)描述最具體表現(xiàn)就是我們可配置的文件。

簡(jiǎn)單點(diǎn)說(shuō)就是容器幫我們創(chuàng)建bean,并理清楚bean與bean之前的關(guān)系,最后存起來(lái)供我們使用。如何創(chuàng)建?如何存?通過(guò)啥規(guī)則順序加載?

總結(jié):ioc 全局上下文緩存的信息 IOC容器何時(shí)創(chuàng)建bean、各個(gè)bean的關(guān)系、怎么存儲(chǔ)bean
spring容器是整個(gè)spring框架的核心,通常我們說(shuō)的spring容器就是bean工廠
bean工廠負(fù)責(zé)創(chuàng)建和初始化bean、裝配bean

見(jiàn)識(shí)一下bean長(zhǎng)啥樣子?

ApplicationContext(XmlWebApplicationContext :-Root WebApplicationContext startup)serializationde==org.springframework.web.context.WebApplicationContext:-—beanFactory--beanDefinitionMap(ConcurrentHashMap ===key:value)ApplicationContext,這是在BeanFactory基礎(chǔ)之上,面向使用Spring框架的開(kāi)發(fā)者。提供了一系列的功能!1、"key:restTemplate" -> "Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=restTemplateConfig; factoryMethodName=restTemplate; initMethodName=null; destroyMethodName=(inferred); defined in com.esgcc.fsp.config.RestTemplateConfig"

流程細(xì)化:定位 加載 注冊(cè) 自動(dòng)依賴注入

流程圖看著很復(fù)雜,簡(jiǎn)單概括一下
1、定位:加載配置文件,找到 .class的存放位置
2、加載:根據(jù)路徑 找到class文件、packname+filename 存List
3、注冊(cè):class.forname() 反射class, 拿到注解、創(chuàng)建對(duì)象bean,存入map -
4、依賴注入:遍歷map,反射每個(gè)class的字段,有@auto 注解 就賦值
以上是對(duì)spring的一個(gè)簡(jiǎn)單的概括,真正的spring肯定在這個(gè)理念上加強(qiáng)了好多。

1、BeanFactory 和 ApplicationContext 有什么區(qū)別?

BeanFactory 可以理解為含有 bean 集合的工廠類。BeanFactory 包含了種 bean 的定義,以便在接 收到客戶端請(qǐng)求時(shí)將對(duì)應(yīng)的 bean 實(shí)例化。 BeanFactory 還能在實(shí)例化對(duì)象的時(shí)生成協(xié)作類之間的關(guān)系。此舉將 bean 自身與 bean 客戶端的配置 中解放出來(lái)。BeanFactory還包含了bean生命周期的控制,調(diào)用客戶端的初始化方法(initialization Methods)和銷毀方法(destruction Methods)。 從表面上看,application context 如同 bean factory 一樣具有 bean 定義、bean 關(guān)聯(lián)關(guān)系的設(shè)置, 根據(jù)請(qǐng)求分發(fā) bean 的功能。但 application context 在此基礎(chǔ)上還提供了其他的功能。 1.提供了支持國(guó)際化的文本消息 2.統(tǒng)一的資源文件讀取方式 3.已在監(jiān)聽(tīng)器中注冊(cè)的 bean 的事件

spring源碼是啥?
1、定位:資源配置 import、classpath、url
2、加載:解析配置文件,把bean包裝成 beanDefintion對(duì)象
3、注冊(cè):把已經(jīng)初始化的beanDefintion對(duì)象放入IOC-map容器
資源定位

此處可通過(guò)xml,定位 class//根據(jù) Xml 配置文件創(chuàng)建 Resource 資源對(duì)象,該對(duì)象中包含了 BeanDefinition 的信息ClassPathResource resource =new ClassPathResource("application-context.xml");//創(chuàng)建 DefaultListableBeanFactoryDefaultListableBeanFactory factory =new DefaultListableBeanFactory();//創(chuàng)建 XmlBeanDefinitionReader 讀取器,用于載入 BeanDefinition。之所以需要 BeanFactory 作為參數(shù),是因?yàn)闀?huì)將讀取的信息回調(diào)配置給 factoryXmlBeanDefinitionReader reader =new XmlBeanDefinitionReader(factory);//XmlBeanDefinitionReader 執(zhí)行載入 BeanDefinition 的方法,最后會(huì)完成 Bean 的載入和注冊(cè)。完成后 Bean 就成功的放置到 IOC 容器當(dāng)中,以后我們就可以從中取得 Bean 來(lái)使用reader.loadBeanDefinitions(resource);

實(shí)際調(diào)用入口 refresh()

接下來(lái)展開(kāi)諸多細(xì)節(jié),
AbstractApplicationContext 的 refresh 函數(shù)載入 Bean 定義過(guò)程

refresh()方法的作用是:在創(chuàng)建 IOC 容器前,如果已經(jīng)有容器存在,則需要把已有的容器銷毀和關(guān)閉,以保證在 refresh 之后使用的是新建立起來(lái)的 IOC 容器。refresh 的作用類似于對(duì) IOC 容器的重啟,public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {//調(diào)用容器準(zhǔn)備刷新的方法,獲取容器的當(dāng)時(shí)時(shí)間,同時(shí)給容器設(shè)置同步標(biāo)識(shí)prepareRefresh();//告訴子類啟動(dòng) refreshBeanFactory()方法,Bean 定義資源文件的載入從子類的 refreshBeanFactory()方法啟動(dòng)ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();//為 BeanFactory 配置容器特性,例如類加載器、事件處理器等prepareBeanFactory(beanFactory);try {//為容器的某些子類指定特殊的 BeanPost 事件處理器postProcessBeanFactory(beanFactory);//調(diào)用所有注冊(cè)的 BeanFactoryPostProcessor 的 BeaninvokeBeanFactoryPostProcessors(beanFactory);//為 BeanFactory 注冊(cè) BeanPost 事件處理器.BeanPostProcessor 是 Bean 后置處理器,用于監(jiān)聽(tīng)容器觸發(fā)的事件registerBeanPostProcessors(beanFactory);//初始化信息源,和國(guó)際化相關(guān).initMessageSource();//初始化容器事件傳播器.initApplicationEventMulticaster();//調(diào)用子類的某些特殊 Bean 初始化方法onRefresh();//為事件傳播器注冊(cè)事件監(jiān)聽(tīng)器.registerListeners();//初始化所有剩余的單例 Bean.finishBeanFactoryInitialization(beanFactory);//初始化容器的生命周期事件處理器,并發(fā)布容器的生命周期事件finishRefresh();} catch (BeansException ex) {//銷毀以創(chuàng)建的單態(tài) BeandestroyBeans();//取消 refresh 操作,重置容器的同步標(biāo)識(shí).cancelRefresh(ex);throw ex;} }

裝配bean的過(guò)程中會(huì)出現(xiàn)一個(gè)問(wèn)題:A依賴B,裝配A的時(shí)候B的實(shí)例還沒(méi)有創(chuàng)建,怎么辦?

spring解決這個(gè)問(wèn)題的辦法是:先創(chuàng)建B對(duì)象,裝配好bean,然后把B注入A,繼續(xù)完成A的裝配. 假設(shè):當(dāng) Bean_A 依賴著 Bean_B,而這個(gè) Bean_A 在加載的時(shí)候,其配置的 ref = “Bean_B” 在解析的時(shí)候只是一個(gè)占位符,被放入了 Bean_A 的屬性集合中,當(dāng)調(diào)用 getBean 時(shí),需要真正 Bean_B 注入到 Bean_A 內(nèi)部時(shí),就需要從容器中獲取這個(gè) Bean_B,因此產(chǎn)生了遞歸。

為什么不是在加載的時(shí)候,就直接注入呢?
因?yàn)榧虞d的順序不同,很可能 Bean_A 依賴的 Bean_B 還沒(méi)有加載好,也就無(wú)法從容器中獲取,你不能要求用戶把 Bean 的加載順序排列好,這是不人道的

Spring 的IoC。將其分為了 2 個(gè)步驟:加載所有的 Bean 配置成 BeanDefinition 到容器中,如果 Bean 有依賴關(guān)系,則使用占位符暫時(shí)代替。然后,在調(diào)用 getBean 的時(shí)候,進(jìn)行真正的依賴注入,即如果碰到了屬性是 ref 的(占位符),那么就從容器里獲取這個(gè) Bean,然后注入到實(shí)例中 —— 稱之為依賴注入。

那么spring Aop如何實(shí)現(xiàn)的呢,其實(shí)是對(duì)對(duì)象進(jìn)行包裝~使其成為代理對(duì)象、這是一個(gè)可以invoke的對(duì)象
猜想一下,1、對(duì)普通bean包裝 2、wrapper存到map中 3、切點(diǎn)可配置

getbean()

具體如何手寫spring請(qǐng)前往

總結(jié)

以上是生活随笔為你收集整理的大话spring~spring那些事的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。