Java反射機(jī)制在Spring IOC中的應(yīng)用詳解
Java反射機(jī)制在Spring IOC的應(yīng)用
IOC:即“控制反轉(zhuǎn)”,不是什么技術(shù),而是一種思想。使用IOC意味著將你設(shè)計(jì)好的對象交給容器控制,而不是傳統(tǒng)的在你的對象內(nèi)部直接控制。
本篇文章主要講解一下IOC底層實(shí)現(xiàn)的原理(反射),Bean容器的實(shí)現(xiàn),就不對IOC的概念進(jìn)行詳述了。
在Spring的配置文件中,經(jīng)??吹饺缦屡渲茫?/p>
<bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>
那么通過這樣配置,Spring是怎么幫我們實(shí)例化對象,并且放到容器中去了了?對,就是通過反射?。?!
下面是Spring通過配置進(jìn)行實(shí)例化對象
并放到容器中的偽代碼:
//解析<bean .../>元素的id屬性得到該字符串值為“courseDao” String idStr = "courseDao"; //解析<bean .../>元素的class屬性得到該字符串值為“com.qcjy.learning.Dao.impl.CourseDaoImpl” String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl"; //利用反射知識,通過classStr獲取Class類對象 Class<?> cls = Class.forName(classStr); //實(shí)例化對象 Object obj = cls.newInstance(); //container表示Spring容器 container.put(idStr, obj);
通過解析xml文件,獲取到id屬性和class屬性里面的內(nèi)容,利用反射原理獲取到配置里面類的實(shí)例對象,存入到Spring的bean容器中。
當(dāng)一個(gè)類里面需要應(yīng)用另一類的對象時(shí),
Spring的配置如下所示
<bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl"> <!-- 控制調(diào)用setCourseDao()方法,將容器中的courseDao bean作為傳入?yún)?shù) --> <property name="courseDao" ref="courseDao"></property> </bean>
我們繼續(xù)用偽代碼的形式來模擬
實(shí)現(xiàn)一下Spring底層處理原理
//解析<property .../>元素的name屬性得到該字符串值為“courseDao” String nameStr = "courseDao"; //解析<property .../>元素的ref屬性得到該字符串值為“courseDao” String refStr = "courseDao"; //生成將要調(diào)用setter方法名 String setterName = "set" + nameStr.substring(0, 1).toUpperCase() + nameStr.substring(1); //獲取spring容器中名為refStr的Bean,該Bean將會作為傳入?yún)?shù) Object paramBean = container.get(refStr); //獲取setter方法的Method類,此處的cls是剛才反射代碼得到的Class對象 Method setter = cls.getMethod(setterName, paramBean.getClass()); //調(diào)用invoke()方法,此處的obj是剛才反射代碼得到的Object對象 setter.invoke(obj, paramBean);
通過上面對Spring底層原理的分析,可以發(fā)現(xiàn),其實(shí)并不難,用到的都是反射機(jī)制,通過反射實(shí)例化對象,存入到Spring的bean容器中。
只要在代碼或配置文件中看到類的完整路徑(包.類),其底層原理基本上使用的就是Java的反射機(jī)制。
反射機(jī)制、反射機(jī)制的作用、反射機(jī)制的功能
1、反射機(jī)制的作用
- 通過java語言中的反射機(jī)制可以i操作字節(jié)碼文件(讀和修改字節(jié)碼文件)
- 通過反射機(jī)制可以操作代碼片段(class文件)
2、Java反射機(jī)制的功能
- 在運(yùn)行時(shí)判斷一個(gè)對象所屬的類
- 在運(yùn)行時(shí)構(gòu)造一個(gè)類的對象
- 在運(yùn)行時(shí)判斷一個(gè)類所具有成員變量和方法
- 在運(yùn)行時(shí)調(diào)用一個(gè)對象的方法
3、反射機(jī)制相關(guān)的重要的類有哪些?
java.lang.Class
: 代表整個(gè)字節(jié)碼,代表一個(gè)類型,代表整個(gè)類。java.lang.reflect.Method
: 代表字節(jié)碼中的方法字節(jié)碼,代表類中的方法。java.lang.reflect.Contructor
: 代表字節(jié)碼中的構(gòu)造方法字節(jié)碼,代表類中的構(gòu)造方法。java.lang.reflect.Field
: 代表字節(jié)碼中的屬性字節(jié)碼,代表類中的成員變量。
代碼如下(示例):
//java.lang.Class public class User{ //Field int no; //Constructor public User(){ } public User(int no){ this.no = no; } //Method public void setNo(int no){ this.no = no; } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Runnable線程傳參,實(shí)現(xiàn)讓run訪問參數(shù)
這篇文章主要介紹了Java Runnable線程傳參,實(shí)現(xiàn)讓run訪問參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09springcloud feign調(diào)其他微服務(wù)時(shí)參數(shù)是對象的問題
這篇文章主要介紹了springcloud feign調(diào)其他微服務(wù)時(shí)參數(shù)是對象的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java統(tǒng)計(jì)文件中每個(gè)字符出現(xiàn)的個(gè)數(shù)
這篇文章主要為大家詳細(xì)介紹了java統(tǒng)計(jì)文件中每個(gè)字符出現(xiàn)的個(gè)數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌
這篇文章主要為大家詳細(xì)介紹了java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09SpringBoot Admin健康檢查功能的實(shí)現(xiàn)
admin主要就是告訴運(yùn)維人員,服務(wù)出現(xiàn)異常,然后進(jìn)行通知(微信、郵件、短信、釘釘?shù)龋┛梢苑浅?焖偻ㄖ竭\(yùn)維人員,相當(dāng)報(bào)警功能,接下來通過本文給大家介紹SpringBoot Admin健康檢查的相關(guān)知識,一起看看吧2021-06-06