自學spring

Spring最基本的功能就是ioc容器,什麼是ioc容器。
一般說道容器,我們都會想到一些高大上的東西,比如tomcat等等這些web容器,docker,甚至有些人將某些數據結構(List,Set,Map)也稱爲容器。可以說容器這個詞已經被用爛了。
那就講解一下容器最本質的意思,就是放東西的東西。所以上面的這些東西都可以被稱之爲容器。那麼什麼是ioc容器,ioc是控制反轉的意思,也有人講ioc稱之爲依賴注入,我們只將他們稱爲專有名詞,就和迭代器一樣,誰能從它的名字裏面猜出它的功能。ioc容器的意思就是,我們將實例化好的對象,存到ioc容器當中,沒當我們需要某種類型,或者某個對象的時候,我們可以通過唯一標識符,或者id,來獲取這個對象。

可能有人會說,這很麻煩。的確,這很麻煩。但是比如碰到某些場景,比如,我們需要平凡的實例化某些實例,就拿web應用來說,比如數據訪問,我們需要頻繁的創建數據訪問的對象,一般情況下,不同的數據類型都會創建不同的數據訪問對象,比如訪問teacher表,和訪問student表用的就不同一種數據訪問對象。比如StudentDao,teacherDao。有人說那我每次都寫一個new,把數據訪問對象實例化不就可以了嘛。的確可以,而且也不會出錯。比如我們可能會用到一堆數據訪問對象,好啊,我們可以將這些對象都在構造函數中實例化了,用到用不到也浪費不了多少資源。這意味着我們每個處理不同請求的類,都有一個非常大的構造函數,裏面用new實例化了非常多的相同的簡單的數據訪問對象。我不知道你寫完這樣的代碼作何感想,你也許你突然會發現自己寫好一個處理請求的構造函數之後,發現其他的構造函數都在複製和粘貼,在做一些沒用的重複勞動,寫的都是無用new代碼。
public class StudyController{
    StudentDao studentDao;
TeachaerDao teacherDao;
HeadMasterDao teacherDao;

    public StudentController(){
        studentDao = new StudentDao();
        teacherDao = new TeacherDao();
        teacherDao = new HeadMasterDao();
        .....
    }
}

那我們可不可以不這樣做呢,可以那就是採用ioc容器。比如你new了一個ioc容器,把要實例化的對象都通過配置文件告訴了ioc容器,而且你採用類型來當做唯一標識符,當然你也可以採用其他的,比如這個對象的id就是1,那個對象的id就是2,這樣同種類型就可以建立不同的對象了。到時候我們只需要實例化以ioc容器(當然這時候人們都愛叫它上下文Context),StudyController就可以這樣寫了。

public class StudyController{
StudentDao studentDao;
TeachaerDao teacherDao;
HeadMasterDao teacherDao;
    public StudentController(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        studentDao = context.get(1);
        teacherDao = context.get(2);
        teacherDao = context.get(3);
        .....
    }

}

看完這些有人要罵我sb了,這不比剛剛還複雜。
但是考慮一下在web應用的時候,我們給這個web應用建立一個全局ioc容器,通過靜態方法來實現,那麼代碼會這樣:

public class StudyController{
StudentDao studentDao;
TeachaerDao teacherDao;
HeadMasterDao teacherDao;

    public StudentController(){
        StudentDao studentDao = MyApplicationContext.get(1);
        TeachaerDao teacherDao = MyApplicationContext.get(2);
        HeadMasterDao teacherDao = MyApplicationContext.get(3);
        .....
    }
}

這樣就和最開始一樣複雜。
那麼spring想了一下,其實這些只是語法上的重複,正在不重複的是id的值。於是spring通過annotation(註解,和註釋有相同的目的,只不過,註釋是給人看的,註解是給ioc容器看的)來改進語法。

public class StudyController{
@Annotation(1)
StudentDao studentDao;
@Annotation(2)
TeachaerDao teacherDao;
@Annotation(3)
HeadMasterDao teacherDao;
}

這樣看一下,是不少寫了很多。好了又的人可能會說,spring就是幫助我們通過它的註解,來改善我們少些代碼。這就錯了,spring的功能很強大,非常強大,但是它對我們最直觀的感受,就是我們可以通過註解來少寫代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章