摘要:控制反轉(zhuǎn),縮寫(xiě)為簡(jiǎn)單來(lái)說(shuō)就是當(dāng)自己需要一個(gè)對(duì)象的時(shí)候不需要自己手動(dòng)去一個(gè),而是由其他容器來(lái)幫你提供里面就是容器。
控制反轉(zhuǎn)(Inversion ofControl,縮寫(xiě)為IoC)
簡(jiǎn)單來(lái)說(shuō)就是當(dāng)自己需要一個(gè)對(duì)象的時(shí)候不需要自己手動(dòng)去new一個(gè),而是由其他容器來(lái)幫你提供;Spring里面就是IOC容器。
例如:
在Spring里面經(jīng)常需要在Service這個(gè)裝配一個(gè)Dao,一般是使用@Autowired注解:類(lèi)似如下
public Class ServiceImpl{ @Autowired Dao dao; public void getData(){ dao.getData(); }
在這里未初始化Dao直接使用是會(huì)報(bào)出空指針異常的,那么在Spring里面的做法就是通過(guò)反射來(lái)將需要的類(lèi)幫你加載進(jìn)來(lái)。
下面是一個(gè)例子模擬了Spring的DI和IOC首先寫(xiě)兩個(gè)注解模擬Spring的注解:
Entity注解代表的是Spring的@Service @Target(ElementType.TYPE) // 類(lèi) @Retention(RetentionPolicy.RUNTIME) public @interface Entity { } 代表的是Spring里面的@Autowrid @Target(ElementType.FIELD) //描述方法的 @Retention(RetentionPolicy.RUNTIME) // 僅運(yùn)行時(shí)保留 public @interface Resources { }
當(dāng)注解建立完成之后再建立兩個(gè)類(lèi):
Rain類(lèi)代表的是需要從其他地方獲取天氣數(shù)據(jù)(數(shù)據(jù)庫(kù)或者服務(wù)器)
public class Rain { public void rain(){ System.out.println("正在下雨"); // 為了方便直接寫(xiě)了 } }
Weather類(lèi)代表的是獲取到的天氣數(shù)據(jù)
@Entity public class Weather { @Resources Rain rain; // 這里在后面通過(guò)反射直接注入rain public void weather_rain() { rain.rain(); }
下面是通過(guò)反射來(lái)直接注入:
首先遍歷指定的包名:這一步先省略,
首先是建立一個(gè)List模擬Spring的bean容器,即將已經(jīng)裝初始化好的帶有Entity注解的類(lèi)全部初始化
public class Weather_reflec { List
最后也就是模擬Controller里面直接使用的
public class WeatherPrediction { public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { WeatherPrediction weatherPrediction =new WeatherPrediction(); Weather weather =(Weather)weatherPrediction.springDo(); weather.weather_rain(); // 這里如果是普通調(diào)用會(huì)報(bào)空指針異常,而容器卻為其將rain這個(gè)變量賦值了,所以可以正常輸出 } /* 模擬Spring啟動(dòng)過(guò)程,這一步其實(shí)可以多帶帶寫(xiě)一個(gè)類(lèi),這一步是容器該做的,而我們并不需要去管 */ public Object springDo() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { Weather_reflec weather_reflec =new Weather_reflec(); // 啟動(dòng)的時(shí)候就需要加載的 Weather weather =new Weather(); //掃描類(lèi)注解后new操作然后進(jìn)行下一步 weather_reflec.get_ref(weather); // 將其類(lèi)里面的變量進(jìn)行new操作并放入容器 Object object =weather_reflec.returnList().get(0); return object; } 運(yùn)行后輸出:正在下雨
在WeatherPrediction里面并沒(méi)有對(duì)Rain進(jìn)行一個(gè)new操作但是卻可以使用,這應(yīng)該是最簡(jiǎn)單的一個(gè)模擬Spring的IOC例子了,當(dāng)然Spring的IOC容器比這個(gè)強(qiáng)大太多了,比如需要考慮線程安全,以及各種的細(xì)節(jié)問(wèn)題
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69893.html
摘要:容器自動(dòng)完成裝載,默認(rèn)的方式是這部分重點(diǎn)在常用模塊的使用以及的底層實(shí)現(xiàn)原理。 對(duì)于那些想面試高級(jí) Java 崗位的同學(xué)來(lái)說(shuō),除了算法屬于比較「天方夜譚」的題目外,剩下針對(duì)實(shí)際工作的題目就屬于真正的本事了,熱門(mén)技術(shù)的細(xì)節(jié)和難點(diǎn)成為了主要考察的內(nèi)容。 這里說(shuō)「天方夜譚」并不是說(shuō)算法沒(méi)用,不切實(shí)際,而是想說(shuō)算法平時(shí)其實(shí)很少用到,甚至面試官都對(duì)自己出的算法題一知半解。 這里總結(jié)打磨了 70 道...
摘要:本文是容器源碼分析系列文章的第一篇文章,將會(huì)著重介紹的一些使用方法和特性,為后續(xù)的源碼分析文章做鋪墊。我們可以通過(guò)這兩個(gè)別名獲取到這個(gè)實(shí)例,比如下面的測(cè)試代碼測(cè)試結(jié)果如下本小節(jié),我們來(lái)了解一下這個(gè)特性。 1. 簡(jiǎn)介 Spring 是一個(gè)輕量級(jí)的企業(yè)級(jí)應(yīng)用開(kāi)發(fā)框架,于 2004 年由 Rod Johnson 發(fā)布了 1.0 版本。經(jīng)過(guò)十幾年的迭代,現(xiàn)在的 Spring 框架已經(jīng)非常成熟了...
摘要:在上文中,我實(shí)現(xiàn)了一個(gè)很簡(jiǎn)單的和容器。比如,我們所熟悉的就是在這里將切面邏輯織入相關(guān)中的。初始化的工作算是結(jié)束了,此時(shí)處于就緒狀態(tài),等待外部程序的調(diào)用。其中動(dòng)態(tài)代理只能代理實(shí)現(xiàn)了接口的對(duì)象,而動(dòng)態(tài)代理則無(wú)此限制。 1. 背景 本文承接上文,來(lái)繼續(xù)說(shuō)說(shuō) IOC 和 AOP 的仿寫(xiě)。在上文中,我實(shí)現(xiàn)了一個(gè)很簡(jiǎn)單的 IOC 和 AOP 容器。上文實(shí)現(xiàn)的 IOC 和 AOP 功能很單一,且 I...
摘要:簡(jiǎn)介本篇文章是容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對(duì)象是方法,該方法用于對(duì)已完成屬性填充的做最后的初始化工作。后置處理器是拓展點(diǎn)之一,通過(guò)實(shí)現(xiàn)后置處理器接口,我們就可以插手的初始化過(guò)程。 1. 簡(jiǎn)介 本篇文章是Spring IOC 容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對(duì)象是 initializeBean 方法,該方法用于對(duì)已完成屬性填充的 bean 做最...
摘要:在寫(xiě)完容器源碼分析系列文章中的最后一篇后,沒(méi)敢懈怠,趁熱打鐵,花了天時(shí)間閱讀了方面的源碼。從今天開(kāi)始,我將對(duì)部分的源碼分析系列文章進(jìn)行更新。全稱(chēng)是,即面向切面的編程,是一種開(kāi)發(fā)理念。在中,切面只是一個(gè)概念,并沒(méi)有一個(gè)具體的接口或類(lèi)與此對(duì)應(yīng)。 1. 簡(jiǎn)介 前一段時(shí)間,我學(xué)習(xí)了 Spring IOC 容器方面的源碼,并寫(xiě)了數(shù)篇文章對(duì)此進(jìn)行講解。在寫(xiě)完 Spring IOC 容器源碼分析系列...
閱讀 2601·2021-11-15 11:38
閱讀 2618·2021-11-04 16:13
閱讀 17981·2021-09-22 15:07
閱讀 1014·2019-08-30 15:55
閱讀 3261·2019-08-30 14:15
閱讀 1663·2019-08-29 13:59
閱讀 3207·2019-08-28 18:28
閱讀 1575·2019-08-23 18:29