国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

自己簡單實現Spring的IOC原理

fasss / 2580人閱讀

摘要:控制反轉,縮寫為簡單來說就是當自己需要一個對象的時候不需要自己手動去一個,而是由其他容器來幫你提供里面就是容器。

控制反轉(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 objectList ;  // 模擬Spring容器

    public Weather_reflec() {
        objectList= new ArrayList();
    }
// 在這里其實最好的做法是先找出帶有注解的類,判斷帶有Entity注解再傳入。但是為了方便直接省略了
    public  void get_ref(Object object) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class clazz =object.getClass();
        if(clazz.isAnnotationPresent(Entity.class)){  //判斷是否帶有Entity注解
            Field[] fields =clazz.getDeclaredFields();  //獲取其變量
            for(Field field :fields){
                if(field.isAnnotationPresent(Resources.class)){  //判斷是否需要注入
                    Class rainClass=Class.forName(field.getType().getName(),false,Thread.currentThread().getContextClassLoader());   // 這里先將Rain類加載
                    field.set(object,rainClass.newInstance()); //賦給rain
                    objectList.add(object);   //最后將已將賦值后的Weather保存進容器
                }
            }
        }
    }

    public List returnList(){
        return objectList;  //返回容器方便以后使用
    }

最后也就是模擬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

相關文章

  • 70 個 Spring 最常見面試題,Java 晉升必會

    摘要:容器自動完成裝載,默認的方式是這部分重點在常用模塊的使用以及的底層實現原理。 對于那些想面試高級 Java 崗位的同學來說,除了算法屬于比較「天方夜譚」的題目外,剩下針對實際工作的題目就屬于真正的本事了,熱門技術的細節和難點成為了主要考察的內容。 這里說「天方夜譚」并不是說算法沒用,不切實際,而是想說算法平時其實很少用到,甚至面試官都對自己出的算法題一知半解。 這里總結打磨了 70 道...

    Ashin 評論0 收藏0
  • Spring IOC 容器源碼分析系列文章導讀

    摘要:本文是容器源碼分析系列文章的第一篇文章,將會著重介紹的一些使用方法和特性,為后續的源碼分析文章做鋪墊。我們可以通過這兩個別名獲取到這個實例,比如下面的測試代碼測試結果如下本小節,我們來了解一下這個特性。 1. 簡介 Spring 是一個輕量級的企業級應用開發框架,于 2004 年由 Rod Johnson 發布了 1.0 版本。經過十幾年的迭代,現在的 Spring 框架已經非常成熟了...

    NSFish 評論0 收藏0
  • 仿照 Spring 實現簡單 IOC 和 AOP - 下篇

    摘要:在上文中,我實現了一個很簡單的和容器。比如,我們所熟悉的就是在這里將切面邏輯織入相關中的。初始化的工作算是結束了,此時處于就緒狀態,等待外部程序的調用。其中動態代理只能代理實現了接口的對象,而動態代理則無此限制。 1. 背景 本文承接上文,來繼續說說 IOC 和 AOP 的仿寫。在上文中,我實現了一個很簡單的 IOC 和 AOP 容器。上文實現的 IOC 和 AOP 功能很單一,且 I...

    AlexTuan 評論0 收藏0
  • Spring IOC 容器源碼分析 - 余下初始化工作

    摘要:簡介本篇文章是容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對象是方法,該方法用于對已完成屬性填充的做最后的初始化工作。后置處理器是拓展點之一,通過實現后置處理器接口,我們就可以插手的初始化過程。 1. 簡介 本篇文章是Spring IOC 容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對象是 initializeBean 方法,該方法用于對已完成屬性填充的 bean 做最...

    Alfred 評論0 收藏0
  • Spring AOP 源碼分析系列文章導讀

    摘要:在寫完容器源碼分析系列文章中的最后一篇后,沒敢懈怠,趁熱打鐵,花了天時間閱讀了方面的源碼。從今天開始,我將對部分的源碼分析系列文章進行更新。全稱是,即面向切面的編程,是一種開發理念。在中,切面只是一個概念,并沒有一個具體的接口或類與此對應。 1. 簡介 前一段時間,我學習了 Spring IOC 容器方面的源碼,并寫了數篇文章對此進行講解。在寫完 Spring IOC 容器源碼分析系列...

    張春雷 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<