1. 程式人生 > 其它 >《spring原始碼IOC主流程解析》

《spring原始碼IOC主流程解析》

一、主流程圖

二、原始碼刨析(IOC主要載入流程)

1. 建立配置類,以及spring的上下文解析配置的主類,來解析包下的所有類 cn.tulignxueyuan;

2.點選進入AnnotationConfigApplicationContext類中,主要有三個方法;

3.this()方法主要做了 建立了beanFactory以及BeanDefinitionReader來讀取bean定義類,BeanDefinitionReader將configClasspostprocess類註冊到BeanDefinitionMap中(注;這裡建立DefinitionScanner不是真正的掃描bean定義的類,這個DefinitionScanner的作用是可以在外面,也就是上下文AnnotationConfigApplicationContext呼叫scan()掃描自定義的包)

4.點選AnnotatedBeanDefinitionReader類到AnnotationConfigUtils類中,建立了幾個創世紀類,也就是解析配置檔案類解析有關@Import,@bean @value等等註解的類,還有自動注入的@Autowired類;

5.上面建立了用來解析配置的類,這一步我們在跳回去,看register(),這個方法其實就是將配置類註冊成bean定義並放入到BeanDefinitionMap中;

6 refresh()方法裡有兩個重要方法invokeBeanFactoryPostProcessors(beanFactory)和finishBeanFactoryInitialization(beanFactory),前者是例項化解BeanDefinitionMap中的創世紀類configClasspostprocess類並通過它來解析配置類MainStat的bean定義,後者是真正例項化所有單例bean,呼叫BeanFactory.getBean()方法來建立例項化bean,屬性注入,以及初始化initbean,同時呼叫9次 beanPostProcess以及很多的Aware介面;

三、原始碼刨析(具體分析創世紀類以及配置類實現後置處理器的解析過程)

1.、上面IOC整體載入流程已經說明,例項化創世紀類以及配置類的方法就是invokeBeanFactoryPostProcessors(beanFactory);

2、點選進去,紅色標記的方法,再次跳進

3.這裡的方法就很重要了,有四種場景分別為:實現BeanDefinitionRegistryPostProcessor、PriorityOrdered由先執行,其次實BeanDefinitionRegistryPostProcessor、Ordered,然後只是實現了BeanDefinitionRegistryPostProcessor,最後實現了BeanDefinitionRegistryPostProcessor、beanFactoryPostProcessors, IOC提供了這四種場景就可以讓我們程式設計師自由發揮,將我們自己定義的bean定義實現想要的效果,當然解析配置類的創世紀類configClassPostProcess實現了第一種所以優先執行,我們自己也可以定義一個配置類來實現這四種創景;

4.創世紀類configClasspostprocess實現了BeanDefinitionRegistryPostProcessor、PriorityOrdered,所以它會去執行這個方法

5.跳進這個方法中

6.因為下面這個類是一個介面,所有必須有實現類來實現,看圖

7.進入實現類中,接著執行圖上標記的方法

8.進入上面的方法後, 往下滑動,找到下面標記的類ConfigurationClassParser,並執行parser.parse(candidates),點選進入parse方法後,再次點選進入裡面的parse方法,你就按著截圖一直往下點選

9.執行上面截圖doProcessConfigurationClass()方法,這個方法裡面就是,解析了@Component @PropertySources @ComponentScans @Import等等註解,以上這些就是整個配置類解析

上面這個就是簡單介紹了IOC後置處理器,主要解析流程

迴圈依賴: 說白了就是通過三級快取+迴圈依賴標誌, 三級快取就是 三個ConcurrentHashMap來解決的, 在例項化的時候,先存入到二級快取, 然後如果全部執行完存入到一級快取中, 每個map集合中去尋找,是否存在,如果存在就不再建立;