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