教你怎么做垃圾網(wǎng)站關(guān)鍵詞排名優(yōu)化公司外包
圖解 Spring 核心數(shù)據(jù)結(jié)構(gòu):BeanDefinition
簡(jiǎn)介
? ? ? ? 使用spring框架的技術(shù)人員都知道spring兩個(gè)大核心技術(shù)IOC和AOP,隨著投入更多的時(shí)間去學(xué)習(xí)spring生態(tài),越發(fā)覺(jué)得spring的發(fā)展不可思議,一直都是引領(lǐng)著Java EE的技術(shù)變革,這樣一系列優(yōu)秀的框架我們應(yīng)該花多一點(diǎn)時(shí)間去深入思考spring生態(tài)的發(fā)展,學(xué)習(xí)spring中優(yōu)秀的設(shè)計(jì)思想。以前學(xué)習(xí)spring我們都是梳理一下spring bean的生命周期,debug一下spring aop的源碼,最近想想感覺(jué)完全不夠深入,所以近期想著出一系列文章,以圖解的方式細(xì)致入微的去理解spring的每一個(gè)細(xì)節(jié),本篇將圍繞BeanDefinition的設(shè)計(jì)這一細(xì)節(jié)展開(kāi)講解,希望對(duì)讀者有所啟發(fā)。
一、spring bean是什么
? ? ? ? 使用了這么久的spring框架,那么spring bean是什么呢?我們都知道spring ioc會(huì)載入和管理我們的bean,我理解bean實(shí)際就是我們程序中使用的對(duì)象,初學(xué)spring的時(shí)候經(jīng)常被問(wèn)到不用spring我們是怎么開(kāi)發(fā)的?沒(méi)有spring我們使用對(duì)象的時(shí)候自己new,一旦該對(duì)象不再被使用,則由 Java 自動(dòng)進(jìn)行垃圾回收。簡(jiǎn)單的描述我們是不是感覺(jué)spring bean沒(méi)什么神秘了,就是我們new的對(duì)象。
????????Spring 中的對(duì)象是 bean,bean實(shí)際上就是我們new的對(duì)象,只不過(guò) Spring 不再自己去 new 對(duì)象了,而是由 IoC 容器去幫助我們實(shí)例化對(duì)象并且管理它,我們需要哪個(gè)對(duì)象,到IoC 容器里獲取即可。IoC 其實(shí)就是解決對(duì)象之間的耦合問(wèn)題,Spring Bean 的生命周期完全由容器控制。
? ? ? ? 我們對(duì)spring bean有了一些概念之后,那我們是否好奇spirng bean是以什么新式存儲(chǔ)的呢?
二、BeanDefinition的設(shè)計(jì)
???????在Spring框架中定義了一個(gè)BeanDefinition接口,用于描述和配置Spring容器中的Bean,用于定義Bean的配置元數(shù)據(jù),包括類名、作用域、構(gòu)造函數(shù)參數(shù)、屬性值、初始化方法、銷毀方法和依賴關(guān)系等信息,BeanDefinition提供了一種抽象,使得開(kāi)發(fā)者能夠以聲明性的方式描述如何實(shí)例化、配置和組裝一個(gè)特定的Bean。
? ? ? 隨著技術(shù)的發(fā)展,BeanDefinition接口得到了極大的發(fā)展豐富,繼承體系如下圖所示:
(1)、AttributeAccessor: 提供對(duì)?BeanDefinition?屬性操作能力。
(2)、AttributeAccessorSupport: 使用了?Map?進(jìn)行屬性的存儲(chǔ)的。
(3)、BeanMetadataAttributeAccessor: 代表了一個(gè) Bean 元數(shù)據(jù)的屬性操作。
(4)、BeanMetadataElement:?BeanDefinition?元數(shù)據(jù),返回該 Bean 的來(lái)源。
(5)、BeanDefinition: 用來(lái)描述 Bean,里面存放 Bean 元數(shù)據(jù),比如 Bean 類名、scope、屬性、構(gòu)造函數(shù)參數(shù)列表、依賴的 Bean、是否是單例類、是否是懶加載等一些列信息。
(6)、AbstractBeanDefinition: 抽象類統(tǒng)一實(shí)現(xiàn)了?BeanDefinition?定義的一部分操作,可以說(shuō)是定義了?BeanDefinition?很多默認(rèn)的屬性。
(7)、RootBeanDefinition: 代表一個(gè) XML,Java Config來(lái)的?BeanDefinition。
(8)、AnnotatedBeanDefinition: 表示注解類型?BeanDefinition。有兩個(gè)重要的屬性:AnnotationMetadata、MethodMetadata?分別表示?BeanDefinition?的注解元信息和方法元信息。實(shí)現(xiàn)了此接口的?BeanDefinition?可以獲取到注解元數(shù)據(jù)和方法元數(shù)據(jù)。
(9)、ChildBeanDefinition: 可以讓子?BeanDefinition?定義擁有從父母那里繼承配置的能力。
(10)、GenericBeanDefinition: 是 Spring 2.5 之后才有的,這個(gè)的想法是用來(lái)替代?RootBeanDefinition/ChildBeanDefinition,而?RootBeanDefinition/ChildBeanDefinition?可以在 Spring 預(yù)加載的時(shí)候使用。
(11)、AnnotatedGenericBeanDefinition: 表示?@Configuration?注解注釋的?BeanDefinition?類。是?AnnotatedBeanDefinition?的一個(gè)具體實(shí)現(xiàn)。傳入指定類后,可以獲取類中的注解。
(12)、ScannedGenericBeanDefinition: 表示?@Component、@Service、@Controller?等注解注釋的 Bean 類。是?AnnotatedBeanDefinition?的另一個(gè)實(shí)現(xiàn),與?AnnotatedGenericBeanDefinition?不同的是,ScannedGenericBeanDefinition?是通過(guò)掃描 class,然后操作 ASM 進(jìn)行解析的。
總結(jié)
? ? ? ? 本篇簡(jiǎn)單介紹了spring bean的相關(guān)概念,以及初步分析了BeanDefinition的設(shè)計(jì),理論概念性的內(nèi)容總是枯燥乏味的,為了不影響文章的可讀性本篇先介紹到這里,后續(xù)再出文章進(jìn)行補(bǔ)充講解。