摘要:對(duì)類(lèi)的實(shí)例化,不是開(kāi)發(fā)者自己通過(guò)的方式來(lái)實(shí)例化,而是通過(guò)框架自身來(lái)實(shí)例化,這過(guò)程稱(chēng)為。一般地,我們也將控制反轉(zhuǎn)稱(chēng)為,依賴(lài)注入。繼續(xù)遍歷這些成員變量,在循環(huán)中判斷當(dāng)前成員變量是否帶有注解,若帶有該注解,則從中根據(jù)類(lèi)取出實(shí)例。
對(duì)類(lèi)的實(shí)例化,不是開(kāi)發(fā)者自己通過(guò)new的方式來(lái)實(shí)例化,而是通過(guò)框架自身來(lái)實(shí)例化,這過(guò)程稱(chēng)為IoC??刂撇皇怯砷_(kāi)發(fā)者來(lái)決定的,而是反轉(zhuǎn)給框架了。一般地,我們也將控制反轉(zhuǎn)稱(chēng)為DI(Dependency Injection,依賴(lài)注入)。那如何實(shí)現(xiàn)呢?
最簡(jiǎn)單的方式是,先通過(guò)BeanHelper獲取所有Bean Map(是一個(gè)Map
分別取出Bean類(lèi)與Bean實(shí)例 ,進(jìn)而通過(guò)反射獲取類(lèi)中所有的成員變量。繼續(xù)遍歷這些成員變量,在循環(huán)中判斷當(dāng)前成員變量是否帶有Inject注解,若帶有該注解,則從Bean Map中根據(jù)Bean類(lèi)取出Bean實(shí)例。最后通過(guò)ReflectionUtil#setField方法來(lái)修改當(dāng)前成員變量的值。
核心實(shí)現(xiàn):
Map, Object> beanMap = BeanHelper.getBeanMap(); if (CollectionUtil.isNotEmpty(beanMap)) { for (Map.Entry , Object> beanEntry : beanMap.entrySet()) { Class> beanClass = beanEntry.getKey(); Object beanInstance = beanEntry.getValue(); Field[] beanFields = beanClass.getDeclaredFields(); if (ArrayUtil.isNotEmpty(beanFields)) { for (Field beanField : beanFields) { if (beanField.isAnnotationPresent(Inject.class)) { Class> beanFieldClass = beanField.getType(); Object beanFieldInstance = beanMap.get(beanFieldClass); if (beanFieldInstance != null) { ReflectionUtil.setField(beanInstance, beanField, beanFieldInstance); } } } } } }
更多架構(gòu)底層實(shí)現(xiàn)代碼請(qǐng)移步
https://github.com/edagarli/own_framework
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65409.html
摘要:入門(mén)和學(xué)習(xí)筆記概述框架的核心有兩個(gè)容器作為超級(jí)大工廠,負(fù)責(zé)管理創(chuàng)建所有的對(duì)象,這些對(duì)象被稱(chēng)為。中的一些術(shù)語(yǔ)切面切面組織多個(gè),放在切面中定義。 Spring入門(mén)IOC和AOP學(xué)習(xí)筆記 概述 Spring框架的核心有兩個(gè): Spring容器作為超級(jí)大工廠,負(fù)責(zé)管理、創(chuàng)建所有的Java對(duì)象,這些Java對(duì)象被稱(chēng)為Bean。 Spring容器管理容器中Bean之間的依賴(lài)關(guān)系,使用一種叫做依賴(lài)...
摘要:楊充一定時(shí)間內(nèi)該點(diǎn)擊事件只能執(zhí)行一次用來(lái)修飾這是一個(gè)什么類(lèi)型的注解。楊充自定義編譯器獲取遍歷,并生成代碼配置文件文件配置的作用是向系統(tǒng)注冊(cè)自定義注解處理器,執(zhí)行編譯時(shí)使用進(jìn)行處理。 目錄介紹 01.創(chuàng)建項(xiàng)目步驟 1.1 項(xiàng)目搭建 1.2 項(xiàng)目功能 02.自定義注解 03.創(chuàng)建Processor 04.compiler配置文件 05.編譯jar 06.如何使用 07.編譯生成代...
摘要:關(guān)于依賴(lài)注入注入的注解提供的注解不僅僅是對(duì)象,還有在構(gòu)造器上,還能用在屬性的方法上。與之相反,的限定符能夠在所有可選的上進(jìn)行縮小范圍的操作,最終能夠達(dá)到只有一個(gè)滿足所規(guī)定的限制條件。注解是使用限定符的主要方式。 本文首發(fā)于泊浮目的專(zhuān)欄:https://segmentfault.com/blog... Spring致力于提供一種方法管理你的業(yè)務(wù)對(duì)象。在大量Java EE的應(yīng)用中,隨處可...
摘要:構(gòu)造函數(shù)注入通過(guò)調(diào)用類(lèi)的構(gòu)造函數(shù),將接口實(shí)現(xiàn)類(lèi)通過(guò)構(gòu)造函數(shù)變量傳入。而在中,其使用橫切技術(shù),將這類(lèi)代碼從原屬的封裝對(duì)象中提取出來(lái),封裝到一個(gè)可重用模塊中,稱(chēng)為。 最近實(shí)習(xí)用到Spring的開(kāi)發(fā)框架,但是之前沒(méi)有接觸過(guò),因此希望利用網(wǎng)上的資源來(lái)學(xué)習(xí)以下。 Spring官方給出了非常全面的介紹,非常適合我這種完全的小白……在這一系列學(xué)習(xí)中,我閱讀的主要資源是5.1.2 Reference ...
摘要:希望大家看完這篇文章能對(duì)小程序性能優(yōu)化有一定的認(rèn)識(shí),如果有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤?,歡迎批評(píng)指正,如果喜歡,歡迎點(diǎn)贊收藏。 小程序從發(fā)布到現(xiàn)在也已經(jīng)有將近兩年的時(shí)間,越來(lái)越來(lái)多的公司開(kāi)始重視小程序生態(tài)帶來(lái)的流量,今年也由于小程序平臺(tái)對(duì)外能力的越來(lái)越多的開(kāi)放以及小程序平臺(tái)的自身優(yōu)化,越來(lái)越多的開(kāi)發(fā)者也自主的投入到小程序的開(kāi)發(fā)當(dāng)中,現(xiàn)在,作為前端如果會(huì)寫(xiě)小程序,絕對(duì)是一個(gè)不折不扣的面試加分項(xiàng)。相...
閱讀 1817·2023-04-26 02:14
閱讀 3743·2021-11-23 09:51
閱讀 1393·2021-10-13 09:39
閱讀 3982·2021-09-24 10:36
閱讀 3023·2021-09-22 15:55
閱讀 3528·2019-08-30 12:57
閱讀 2045·2019-08-29 15:30
閱讀 1990·2019-08-29 13:19