Spring注解@DependsOn解析
介紹
今天要分享得是Spring的@DependsOn注解,對(duì)于@DependsOn,我們從它的名稱(chēng)里面就能看出意思是“依賴(lài)于”,那么在Spring中,它的作用就是解決Bean的創(chuàng)建依賴(lài),比如某個(gè)Bean在創(chuàng)建的時(shí)候依賴(lài)另外一個(gè)bean,所以需要另外一個(gè)bean先創(chuàng)建,然后再創(chuàng)建自己。
注解詳情
@DependsOn注解可以標(biāo)注在類(lèi)上和方法上面,只有一個(gè)屬性value,它是一個(gè)數(shù)組,表示依賴(lài)的bean名稱(chēng)的數(shù)組,可以指定一個(gè)或者多個(gè)。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {
String[] value() default {};使用
如下,在DependsOnBeanA上標(biāo)注了@DependsOn注解,那么DependsOnBeanA需要在Bean dependsOnBeanB創(chuàng)建完成之后才能創(chuàng)建自己,這里value的值為bean的名稱(chēng),如果沒(méi)有對(duì)bean設(shè)置名稱(chēng),那么就為首字母為小寫(xiě)的類(lèi)名。
@Component
@DependsOn(value = {"dependsOnBeanB"})
public class DependsOnBeanA {
}源碼解析
spring掃描到所有的標(biāo)有@Component(@Service,@Repository等注解本質(zhì)就是@Component)的類(lèi)和標(biāo)有@Bean的方法后,會(huì)進(jìn)行處理,這里,它會(huì)判斷是否標(biāo)注有@DependsOn,如果標(biāo)注有,則會(huì)設(shè)置BeanDefinition的dependsOn,設(shè)置其依賴(lài)的bean,如下在AnnotationConfigUtils注解工具類(lèi)中源碼如下。
static void processCommonDefinitionAnnotations(AnnotatedBeanDefinition abd, AnnotatedTypeMetadata metadata) {
//省略若干代碼
AnnotationAttributes dependsOn = attributesFor(metadata, DependsOn.class);
if (dependsOn != null) {
abd.setDependsOn(dependsOn.getStringArray("value"));
}
}上面是在注冊(cè)bean元數(shù)據(jù)階段,注冊(cè)元數(shù)據(jù)階段只是組裝好bean之間的依賴(lài),然后在真正創(chuàng)建bean的時(shí)候,才會(huì)進(jìn)行判斷,如下在AbstractBeanFactory類(lèi)中的doGetBean中,會(huì)從RootBeanDefinition中取出dependsOn的值,不為空則進(jìn)行bean的創(chuàng)建,創(chuàng)建bean的過(guò)程和其他bean的創(chuàng)建過(guò)程也是一樣的。
protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
throws BeansException {
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
// Guarantee initialization of beans that the current bean depends on.
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
for (String dep : dependsOn) {
if (isDependent(beanName, dep)) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
}
registerDependentBean(dep, beanName);
try {
getBean(dep);
} catch (NoSuchBeanDefinitionException ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
}
}
}
}從上面可以看出,其實(shí)還是比較簡(jiǎn)單,主要就是判斷是否有依賴(lài)的bean,如果有就先創(chuàng)建依賴(lài)的bean,沒(méi)有的話(huà)就往下執(zhí)行。
總結(jié)
上面我們對(duì)@DependsOn作了簡(jiǎn)單的介紹,對(duì)其的使用方法進(jìn)行簡(jiǎn)單示例,也對(duì)核心源碼進(jìn)行分析,還是比較簡(jiǎn)單,他們都是bean創(chuàng)建過(guò)程中的一些增強(qiáng),spring的創(chuàng)建過(guò)程還是比較簡(jiǎn)單,但是就是因?yàn)樗墓δ茳c(diǎn)比較多,所以在創(chuàng)建過(guò)程中會(huì)有各種擴(kuò)展,各種判斷,所以就會(huì)變得很復(fù)雜,不過(guò)它的主線(xiàn)還是比較清晰的,在進(jìn)行分析的時(shí)候,可以先從主線(xiàn)進(jìn)行分析,然后再慢慢去看主線(xiàn)分出去的邏輯。
到此這篇關(guān)于Spring注解@DependsOn解析的文章就介紹到這了,更多相關(guān)Spring注解@DependsOn內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Netty分布式獲取異線(xiàn)程釋放對(duì)象源碼剖析
這篇文章主要為大家介紹了Netty分布式獲取異線(xiàn)程釋放的對(duì)象源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-03-03
Java深入探索線(xiàn)程安全和線(xiàn)程通信的特性
這篇文章主要介紹了Java線(xiàn)程安全和線(xiàn)程通信的特性,線(xiàn)程安全是多線(xiàn)程編程時(shí)的計(jì)算機(jī)程序代碼中的一個(gè)概念。在擁有共享數(shù)據(jù)的多條線(xiàn)程并行執(zhí)行的程序中,線(xiàn)程安全的代碼會(huì)通過(guò)同步機(jī)制保證各個(gè)線(xiàn)程都可以正常且正確的執(zhí)行,不會(huì)出現(xiàn)數(shù)據(jù)污染等意外情況2022-05-05
java實(shí)現(xiàn)圖片任意角度旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖片任意角度旋轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
Apache Calcite進(jìn)行SQL解析(java代碼實(shí)例)
Calcite是一款開(kāi)源SQL解析工具, 可以將各種SQL語(yǔ)句解析成抽象語(yǔ)法樹(shù)AST(Abstract Syntax Tree), 之后通過(guò)操作AST就可以把SQL中所要表達(dá)的算法與關(guān)系體現(xiàn)在具體代碼之中,今天通過(guò)代碼實(shí)例給大家介紹Apache Calcite進(jìn)行SQL解析問(wèn)題,感興趣的朋友一起看看吧2022-01-01
Mybatis查詢(xún)返回Map<String,Object>類(lèi)型的實(shí)現(xiàn)
本文主要介紹了Mybatis查詢(xún)返回Map<String,Object>類(lèi)型的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Windows下apache ant安裝、環(huán)境變量配置教程
這篇文章主要介紹了Windows下apache ant安裝、環(huán)境變量配置教程,ANT的安裝很簡(jiǎn)單,本文同時(shí)講解了驗(yàn)證安裝是否成功的方法和使用方法實(shí)例,需要的朋友可以參考下2015-06-06
構(gòu)建多模塊的Spring Boot項(xiàng)目步驟全紀(jì)錄
這篇文章主要給大家介紹了關(guān)于如何構(gòu)建多模塊的Spring Boot項(xiàng)目的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

