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

資訊專(zhuān)欄INFORMATION COLUMN

自己簡(jiǎn)單實(shí)現(xiàn)Spring的IOC原理

fasss / 2577人閱讀

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

    public Weather_reflec() {
        objectList= new ArrayList();
    }
// 在這里其實(shí)最好的做法是先找出帶有注解的類(lèi),判斷帶有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類(lèi)加載
                    field.set(object,rainClass.newInstance()); //賦給rain
                    objectList.add(object);   //最后將已將賦值后的Weather保存進(jìn)容器
                }
            }
        }
    }

    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();  // 這里如果是普通調(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

相關(guān)文章

  • 70 個(gè) Spring 最常見(jiàn)面試題,Java 晉升必會(huì)

    摘要:容器自動(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 道...

    Ashin 評(píng)論0 收藏0
  • Spring IOC 容器源碼分析系列文章導(dǎo)讀

    摘要:本文是容器源碼分析系列文章的第一篇文章,將會(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)非常成熟了...

    NSFish 評(píng)論0 收藏0
  • 仿照 Spring 實(shí)現(xiàn)簡(jiǎn)單 IOC 和 AOP - 下篇

    摘要:在上文中,我實(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...

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

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

    Alfred 評(píng)論0 收藏0
  • Spring AOP 源碼分析系列文章導(dǎo)讀

    摘要:在寫(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 容器源碼分析系列...

    張春雷 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<