spring

bean

   @Component 是一種通用的注解,可以讓spring容器自動(dòng)注冊(cè)
   @Repository, @Service, and @Controller 是更特殊化的 @Component 注解
   如@Repository  支持事務(wù)異常處理
   @RestController annotation from Spring MVC is composed of @Controller and 
   @ResponseBody.

    @Resource  -    根據(jù)字段name來(lái)注入
    @SpringBootTest     用junit-test 啟動(dòng)springBoot

初始化和銷毀

實(shí)現(xiàn)InitializingBean  ,中重寫(xiě)afterPropertiesSet()  該bean對(duì)象會(huì)在初始化的時(shí)候被調(diào)用,   
DisposableBean 在對(duì)象被銷毀的時(shí)候 回調(diào) destroy()  方法.



preInstantiateSingletons()       會(huì)初始化所有的bean對(duì)象    從
Class-      DefaultListableBeanFactory         -            beanDefinitionNames 中拿到定義

beanUtil-instantiateClass


初始化bean 依賴    AbstractAutowireCapableBeanFactory-populateBean

refreshContext(context)-    invokeBeanFactoryPostProcessors(beanFactory);    初始

化 registerBeanDefinition  


isCandidateComponent  通過(guò)有沒(méi)有注解來(lái)判斷  是否加入candidate


    //spring 注入依賴
    ReflectionUtils.makeAccessible(field);
                field.set(bean, value);



大致描述一下 beanDefinition -

目前簡(jiǎn)單得講最原始得一種 解析DefaultListableBeanFactory->beanDefinition
在refreshContext(context)- invokeBeanFactoryPostProcessors(beanFactory) 來(lái)填充beanDefinitionMap
通過(guò)springBoot得啟動(dòng)類 如SpringApplication.run(DemoSourceApplication.class, args);
拿到DemoSourceApplication.class, 得basepath. 通過(guò)JAVA Recoure 類 資源來(lái)解析下面所有得jar class文件, 裝載進(jìn)入一個(gè)集合, 在通過(guò)循環(huán)這個(gè)集合 解析是否 是否有注解 是否滿足isCandidateComponent ,滿足就加入 ,目前位置就會(huì)有所有需要初始化類得bean-definition

大致得初始化流程-

入口-

// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);

this.beanDefinitionNames 拿到所有得bean定義
通過(guò)AbstractBeanFactory->getbean 去實(shí)例化生成bean對(duì)象

這里實(shí)例化bean對(duì)象是通過(guò)原始java.lang 反射包去生成對(duì)象,
同時(shí)最重要的一點(diǎn)也是
如果對(duì)象中存在依賴,也是spring對(duì)象,

class A{
@Autoware
   B  b;
 }

 class B{
  @AutoWare
    C c;
}

class C{}

這時(shí)候spring得初始化順序是 先初始化A , 在初始化 B 在初始化C
遞歸裝載, 然后把C賦值給B , 在把B賦值給A
通過(guò)


ReflectionUtils.makeAccessible(field);
                field.set(bean, value);

初始化所有的 web-path

在requestMappingHandlerMapping 這個(gè)對(duì)象實(shí)例化的時(shí)候調(diào)用initializeBean-> invokeInitMethods ->.afterPropertiesSet()

初始化時(shí)關(guān)鍵一步 -

   // Create bean instance.
               if (mbd.isSingleton()) {
                   sharedInstance = getSingleton(beanName, () -> {
                       try {
                           return createBean(beanName, mbd, args);
                       }
                       catch (BeansException ex) {
                           // Explicitly remove instance from singleton cache: It might have been put there
                           // eagerly by the creation process, to allow for circular reference resolution.
                           // Also remove any beans that received a temporary reference to the bean.
                           destroySingleton(beanName);
                           throw ex;
                       }
                   });
                   bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
               }


在getObjectForBeanInstance  方法中如果這個(gè)初始化對(duì)象實(shí)現(xiàn)了FactoryBean
那么這個(gè)實(shí)列  會(huì)調(diào)用sharedInstance 中g(shù)etObject () 方法 返回正在的實(shí)例
   
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容