大话spring~spring那些事
說(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ǔ)言描述:
簡(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容器
資源定位
實(shí)際調(diào)用入口 refresh()
接下來(lái)展開(kāi)諸多細(xì)節(jié),
AbstractApplicationContext 的 refresh 函數(shù)載入 Bean 定義過(guò)程
裝配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 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)題。
- 上一篇: 架构组件—Android应用中使用视图绑
- 下一篇: SAR笔记-卫星轨道建模