Spring IoC概念 原

    Spring現在是我們在開發當中必不可少的框架,幾乎所有的java項目都用到了spring框架,但是有時候想一想感覺雖然是每天都在和Spring框架接觸,但是好像還真的不太瞭解它背後的原理,所以最近把Spring的一些知識整理一下,寫一些博客做一個記錄。

    

什麼是Spring IoC

    Spring IoC有一箇中文解釋:控制反轉。控制反轉的意思就是我們把創建對象的權利交給Spring來完成,我們不需要去創建對象,只需要在要用到的時候調用對象就行,而這些對象都在Spring的IoC容器裏面存儲着。舉一個例子,我們創建了一個Student類,Student類裏面有一個study()方法,這時候我們再創建一個Teacher類,如過我們想要在Teacher中調用Student的study()方法的話就需要像下面代碼一樣在Teacher中new一個Student實例然後調用study()方法,一般的代碼中我們是這樣做的,但是在一項目當中我們往往需要用到很多不同的類當中的不同方法,這樣我們就需要不停的new出需要的對象的實例,而且這些實例在我們使用完之後有時候就沒什麼用了,這樣不僅我們要在代碼中不停地去new新的實例,也非常影響代碼的性能。Spring IoC很好地爲我們解決了這個問題,當我們的代碼利用Spring跑起來的時候,Spring會在IoC容器中爲我們代碼中需要創建實例的類創建好實例放在IoC容器當中(當然我們也可以設置在用到Spring在我們用到某個對象的實例的時候在創建也行),我們需要的時候再去調用就可以,而且Spring中創建這些實例默認是單例模式,只會創建一個,這樣就相當於節省了代碼的性能消耗。

    這就是Spring IoC,爲我們的系統創建並保存實例供我們在需要的時候調用。

public class Student {
    public void study() {
        System.out.println("學生正在學習。。。");
    }
}

public class Teacher {
    public static void main(String[] args) {
        Student student = new Student();
        student.study();
    }
}

 

Spring的IoC容器

    剛剛在上面提到了Spring的IoC容器,它是一個放置Spring所產生的對象實例(Spring中稱呼這些實例爲bean)的地方,我們可以再IoC容器當中獲取我們需要的所有項目的實例也就是bean。

    Spring IoC容器的設計主要是基於BeanFactory和ApplicationContext兩個接口,其中ApplicationContext是BeanFactory的子接口,BeanFactory是一個頂級接口,我們在實際開發過程中用到最多的往往是ApplicationContext這個子接口,因爲ApplicationContext相當於BeanFactory的一個擴展,和BeanFactory比起來,ApplicationContext的方法和功能更加齊全。

 

Spring IoC在代碼當中的實現

    再好的理論也要用到實踐當中,上面講的都是一個Spring的理論知識,到底Spring IoC在代碼裏是如何展示的?這裏是一個我個人的理解。(由於現在流行的是以註解的方式開發,所以我們這裏就以註解方式爲例,XML方法不作講解)。

    Spring IoC的作用是控制反轉,幫助我們來創建對象的實例,但是Spring如何知道到底哪些類需要被創建實例?我們一般在需要被創建實例的類上加上特定的註解告訴Spring這個類需要被創建實例總共四個註解:@Controller,@Service和@Repository這三個分別用來註解controller層、service層和dao層。還有一個特殊的註解@Component哪一層都可以註釋,使用註解的時候放在類的最上面即可。其實這幾個註釋在目前來說區別不得太大,它們的功能僅僅是通知Spring將目標類創建一個實例放在IoC容器中即可,當時Spring建議將這些類的每一層註釋清楚,不排除以後會做區分的可能,所以在寫代碼的時候一定要注意規範。

//註解放在類的上方
@Service
public class MenuServiceImpl implements MenuService {

    當然僅僅是使用註解是不夠的,我們需要告訴Spring這些有註解的類文件的地址,於是這裏一般是在xml文件中配置掃描器,我們一般在Springmvc的xml配置@Controller的掃描,在Spring配置文件裏面配置@Service和@Repository的掃描,如下代碼base-package中設置的即爲這些註解類所在的包。

<!-- springmvc配置文件 -->
<!-- 自動掃描的包名,只掃描@Controller -->
<context:component-scan base-package="com.test.controller" >
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!-- spring配置文件 -->
<!-- 掃描service和dao包下所有使用註解的類型 -->
<context:component-scan base-package="com.test.service">
	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

 

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