Java反射機(jī)制在Spring IOC中的應(yīng)用詳解
Java反射機(jī)制在Spring IOC的應(yīng)用
IOC:即“控制反轉(zhuǎn)”,不是什么技術(shù),而是一種思想。使用IOC意味著將你設(shè)計(jì)好的對(duì)象交給容器控制,而不是傳統(tǒng)的在你的對(duì)象內(nèi)部直接控制。
本篇文章主要講解一下IOC底層實(shí)現(xiàn)的原理(反射),Bean容器的實(shí)現(xiàn),就不對(duì)IOC的概念進(jìn)行詳述了。
在Spring的配置文件中,經(jīng)??吹饺缦屡渲茫?/p>
<bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>
那么通過(guò)這樣配置,Spring是怎么幫我們實(shí)例化對(duì)象,并且放到容器中去了了?對(duì),就是通過(guò)反射?。?!
下面是Spring通過(guò)配置進(jìn)行實(shí)例化對(duì)象
并放到容器中的偽代碼:
//解析<bean .../>元素的id屬性得到該字符串值為“courseDao” String idStr = "courseDao"; //解析<bean .../>元素的class屬性得到該字符串值為“com.qcjy.learning.Dao.impl.CourseDaoImpl” String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl"; //利用反射知識(shí),通過(guò)classStr獲取Class類(lèi)對(duì)象 Class<?> cls = Class.forName(classStr); //實(shí)例化對(duì)象 Object obj = cls.newInstance(); //container表示Spring容器 container.put(idStr, obj);
通過(guò)解析xml文件,獲取到id屬性和class屬性里面的內(nèi)容,利用反射原理獲取到配置里面類(lèi)的實(shí)例對(duì)象,存入到Spring的bean容器中。
當(dāng)一個(gè)類(lèi)里面需要應(yīng)用另一類(lèi)的對(duì)象時(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ù)用偽代碼的形式來(lái)模擬
實(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將會(huì)作為傳入?yún)?shù) Object paramBean = container.get(refStr); //獲取setter方法的Method類(lèi),此處的cls是剛才反射代碼得到的Class對(duì)象 Method setter = cls.getMethod(setterName, paramBean.getClass()); //調(diào)用invoke()方法,此處的obj是剛才反射代碼得到的Object對(duì)象 setter.invoke(obj, paramBean);
通過(guò)上面對(duì)Spring底層原理的分析,可以發(fā)現(xiàn),其實(shí)并不難,用到的都是反射機(jī)制,通過(guò)反射實(shí)例化對(duì)象,存入到Spring的bean容器中。
只要在代碼或配置文件中看到類(lèi)的完整路徑(包.類(lèi)),其底層原理基本上使用的就是Java的反射機(jī)制。
反射機(jī)制、反射機(jī)制的作用、反射機(jī)制的功能
1、反射機(jī)制的作用
- 通過(guò)java語(yǔ)言中的反射機(jī)制可以i操作字節(jié)碼文件(讀和修改字節(jié)碼文件)
- 通過(guò)反射機(jī)制可以操作代碼片段(class文件)
2、Java反射機(jī)制的功能
- 在運(yùn)行時(shí)判斷一個(gè)對(duì)象所屬的類(lèi)
- 在運(yùn)行時(shí)構(gòu)造一個(gè)類(lèi)的對(duì)象
- 在運(yùn)行時(shí)判斷一個(gè)類(lèi)所具有成員變量和方法
- 在運(yùn)行時(shí)調(diào)用一個(gè)對(duì)象的方法
3、反射機(jī)制相關(guān)的重要的類(lèi)有哪些?
java.lang.Class: 代表整個(gè)字節(jié)碼,代表一個(gè)類(lèi)型,代表整個(gè)類(lèi)。java.lang.reflect.Method: 代表字節(jié)碼中的方法字節(jié)碼,代表類(lèi)中的方法。java.lang.reflect.Contructor: 代表字節(jié)碼中的構(gòu)造方法字節(jié)碼,代表類(lèi)中的構(gòu)造方法。java.lang.reflect.Field: 代表字節(jié)碼中的屬性字節(jié)碼,代表類(lèi)中的成員變量。
代碼如下(示例):
//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)文章
Spring對(duì)靜態(tài)變量無(wú)法注入的解決方案
這篇文章主要介紹了使用Spring對(duì)靜態(tài)變量無(wú)法注入的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2021-07-07
Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解
這篇文章主要介紹了Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Elasticsearch8.1中的Script使用實(shí)例深入解讀
這篇文章主要為大家介紹了Elasticsearch8.1中的Script使用實(shí)例深入解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
在Java的MyBatis框架中建立接口進(jìn)行CRUD操作的方法
這篇文章主要介紹了在Java的MyBatis框架中建立接口進(jìn)行CRUD操作的方法,CRUD是指在做計(jì)算處理時(shí)的增加(Create)、重新取得數(shù)據(jù)(Retrieve)、更新(Update)和刪除(Delete)幾個(gè)單詞的首字母簡(jiǎn)寫(xiě),需要的朋友可以參考下2016-04-04
Mybatis SqlSessionFactory與SqlSession詳細(xì)講解
SqlSessionFactory是MyBatis的核心類(lèi)之一,其最重要的功能就是提供創(chuàng)建MyBatis的核心接口SqlSession,所以我們需要先創(chuàng)建SqlSessionFactory,為此我們需要提供配置文件和相關(guān)的參數(shù)2022-11-11
Spring動(dòng)態(tài)多數(shù)據(jù)源配置實(shí)例Demo
本篇文章主要介紹了Spring動(dòng)態(tài)多數(shù)據(jù)源配置實(shí)例Demo,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
從java源碼分析線程池(池化技術(shù))的實(shí)現(xiàn)原理
這篇文章主要介紹了從java源碼分析線程池(池化技術(shù))的實(shí)現(xiàn)原理,池化技術(shù)是一種編程技巧,當(dāng)程序出現(xiàn)高并發(fā)時(shí),能夠明顯的優(yōu)化程序,降低系統(tǒng)頻繁創(chuàng)建銷(xiāo)毀連接等額外開(kāi)銷(xiāo),下文更多的相關(guān)介紹需要的小伙伴可以參考一下2022-04-04
解決在Idea 2020.2下使用 Lombok的注解不生效的問(wèn)題(插件安裝了,依賴也寫(xiě)了,自動(dòng)注解也設(shè)置了)
這篇文章主要介紹了在Idea 2020.2下使用 Lombok的注解不生效的問(wèn)題(插件安裝了,依賴也寫(xiě)了,自動(dòng)注解也設(shè)置了),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Java 實(shí)現(xiàn)萬(wàn)年歷總結(jié)
這篇文章主要介紹了Java 萬(wàn)年歷實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-09-09

