@Value java doc文檔指出,它是由AutowiredAnnotationBeanPostProcessor這個BeanPostProcessor處理的。
AutowiredAnnotationBeanPostProcessor的構(gòu)造方法如下:
可見AutowiredAnnotationBeanPostProcessor用來處理@Autowired和@Value這兩個注解。
具體的處理流程是通過在容器對bean進行實例化的時候應(yīng)用上述BeanPostProcessor.
示例分析(以@Value為例):
controller類:
啟動類:
完整流程如下:
主類運行main方法,運行到SpringApplication的靜態(tài)run方法:
該方法調(diào)用了重載的run方法:
該方法首先創(chuàng)建出了一個SpringApplication對象,然后調(diào)用了該對象的run方法:
該run方法中調(diào)用了refreshContex方法:
refreshContext方法調(diào)用了refresh方法:
該方法又調(diào)用了applicationContext對象的refresh方法,此處的applicationContext的實際類型是ServletWebServerApplicationContext,所以調(diào)用的是ServletWebServerApplicationContext的refresh方法:
這個refresh方法調(diào)用了父類的refresh方法,也就是AbstractApplicationContext的refresh方法:
其中會調(diào)用finisheBeanFactoryInitialization方法,它的代碼如下:
其中會調(diào)用preInstantiateSingletons方法,它的代碼如下:
preInstantiateSingletons這個方法會實例化所有的singleton的bean,
在實例化我自己定義的DemoController類的這個bean時,
其中調(diào)用的getBean方法代碼如下(位于AbstractBeanFactory類):
其中調(diào)用的doGetBean方法代碼如下:
然后會執(zhí)行到上圖中畫線的getSingleton,因為此時demoController這個bean還不存在,所以,getSingleton執(zhí)行過成中會調(diào)用lambda表達式中的createBean來創(chuàng)建democontroller bean, createBean的代碼如下:
其中調(diào)用了doCreateBean,它的代碼如下:
其中調(diào)用了populateBean,它的代碼如下:
其中對容器中的BeanPostProcessor(AutowiredAnnotationBeanPostProcessor包含在其中)進行遍歷,調(diào)用了postProcessProperties方法,AutowiredAnnotationBeanPostProcessor的postProcessProperties代碼如下:
其中調(diào)用的inject方法代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-641329.html
其中調(diào)用的inject方法代碼如下(位于AutowiredAnnotationBeanPostProcessor):
可以看到這個方法首先拿到了要注入的值(value = resolveFieldValue(field, bean, beanName),然后利用反射給bean的屬性設(shè)置了值(field.set(bean,value)).
resolveFiledValue的邏輯是什么呢?代碼如下:
其中調(diào)用了beanFactory.resolveDependency方法,它的代碼如下:
其中調(diào)用了doResolveDependency,它的代碼如下:
其中調(diào)用的resolveEmbededValue代碼如下:
在其中會遍歷embeddedValueResolvers成員變量,用它所包含的StringValueResolver進行解析,最后把解析的結(jié)果返回。文章來源地址http://www.zghlxwxcb.cn/news/detail-641329.html
到了這里,關(guān)于SpringBoot復(fù)習:(18)@Value和@Autowired注解配置的屬性是怎么注入到bean中的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!