一篇文章學(xué)會(huì)Spring框架的基礎(chǔ)IoC(控制反轉(zhuǎn))

做java web應(yīng)用,勢(shì)必要學(xué)習(xí)spring,在實(shí)際應(yīng)用中,幾乎所有的web架構(gòu)都是基于spring框架。它的成功來(lái)自于理念,其中最為核心的理念是控制反轉(zhuǎn)(IoC)與面向切面編程(AOP),本篇文章會(huì)以通俗的方式詳細(xì)介紹spring Ioc的知識(shí),它是spring的基礎(chǔ)。

Spring IoC的概念

控制反轉(zhuǎn)是一種描述(XML或者注解)并通過(guò)第三方來(lái)生成特定的對(duì)象的方式。它是個(gè)很抽象的概念,很不好理解。舉個(gè)例子:

一個(gè)人在家肚子餓了,需要吃飯,在不去餐館或者外賣的情況下,他需要自己來(lái)做飯充饑,要做菜、煮米飯,這是一個(gè)主動(dòng)做飯的過(guò)程。當(dāng)它希望點(diǎn)份外賣來(lái)解決饑餓問(wèn)題,此時(shí)飯菜變?yōu)椴宛^來(lái)做,雖然此人并沒(méi)有主動(dòng)創(chuàng)造一頓飯菜,只需向商家描述需要什么飯菜什么口味即可,最后由餐館創(chuàng)造,也能實(shí)現(xiàn)充饑,填飽肚子。這是一個(gè)被動(dòng)做飯的過(guò)程。這個(gè)例子恰巧包含了控制反轉(zhuǎn)的思想。下面將用編碼來(lái)體現(xiàn)一下主動(dòng)創(chuàng)建與被動(dòng)創(chuàng)建,以煮米飯為例。

定義一個(gè)類 Meal(飯),有水和米、工具幾個(gè)屬性。

public class Meal {
    private String water;
    private String rice;
    private String tool;
    public Meal() {
    }
 public Meal(String water, String rice, String tool) {
        this.water = water;
        this.rice = rice;
        this.tool = tool;
    }

自己煮飯(自己創(chuàng)造Meal的實(shí)例)

 Meal meal = new Meal("純凈水","東北香米","電飯煲");

自己煮飯,這是一個(gè)主動(dòng)的過(guò)程,需要你什么都要會(huì),會(huì)操作電飯煲,會(huì)洗米,知道添加多少水,煮多長(zhǎng)時(shí)間。
假如不想自己煮飯,而是點(diǎn)一份外賣,飯將由餐館(Spring 容器)來(lái)做好,只需要向餐館(spring容器)描述即可。描述可以用xml或者注解,在java工程的classpath下創(chuàng)建spring-cfg.xml文件,內(nèi)容如下:

<?xml version='1.0' encoding='UTF-8' ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
    
    <bean id="meal" class="com.mmdet.learn.ssm.spring.pojo.Meal">
        <property name="rice" value="東北大米"/>
        <property name="tool" value="電飯煲"/>
        <property name="water" value="純凈水"/>
    </bean>
</beans>

這樣完成了描述,那么怎么從餐館(Spring容器)獲取呢,如下:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-cfg.xml");
Meal meal = (Meal)context.getBean("meal");
System.out.println(meal.getRice());

最終,也獲得了飯這個(gè)實(shí)例。它是由餐館(Spring容器)來(lái)創(chuàng)造的,顯然,我們并不需要關(guān)心它是怎么做的,做了多久,只告訴它你要吃什么樣的大米,什么鍋煮出來(lái)的,創(chuàng)造的過(guò)程完全交給了餐館,哎,終于可以吃飯了。

對(duì)于上述編碼,涉及到一個(gè)Spring容器的概念,Spring IoC(控制反轉(zhuǎn))是一個(gè)理念,而實(shí)現(xiàn)它的是IoC容器,具體實(shí)現(xiàn)方法是依賴注入(DI),如上述例子,米飯依賴于水,大米,電飯鍋以及描述來(lái)創(chuàng)造的,而煮米飯的又是餐廳,需要吃飯的人,只需要知道餐廳可以做飯可以買飯就行,并不用管如何來(lái)做。

正如團(tuán)隊(duì)協(xié)作開發(fā)一個(gè)java應(yīng)用一樣,熟悉數(shù)據(jù)庫(kù)得同事完成數(shù)據(jù)庫(kù)模塊的接口開發(fā),將其發(fā)布到Spring容器里,其他同事如果需要,那么就可以通過(guò)描述來(lái)得到一個(gè)接口實(shí)例,從而調(diào)用接口服務(wù)。而數(shù)據(jù)庫(kù)模塊的底層代碼如何實(shí)現(xiàn),連接的什么數(shù)據(jù)庫(kù)使用者并不需要知道,只需要知道用它能完成相應(yīng)功能即可。

這就是控制反轉(zhuǎn)的概念,它最大的好處就是降低對(duì)象之間的耦合度,一些類,你不需要關(guān)心它如何實(shí)現(xiàn)的,只要知道它什么作用就好。這里的對(duì)象的產(chǎn)生依靠IoC容器,而不是開發(fā)者自己去創(chuàng)建一個(gè)對(duì)象。本來(lái)對(duì)象的創(chuàng)建是由開發(fā)者來(lái)完成,但是現(xiàn)在對(duì)象的創(chuàng)建由IoC容器來(lái)完成,基于這樣的被動(dòng)創(chuàng)建對(duì)象的形式,就可以說(shuō)是對(duì)象的控制被反轉(zhuǎn)了。

Spring IoC容器

從上面的例子中,我們知道IoC容器容可以裝納我們開發(fā)的所有Bean(類),并且可以通過(guò)描述獲取各種發(fā)布在Spring IoC容器里的各種Bean.
Spring IoC器的設(shè)計(jì)主要是基于BeanFactory和ApplicationContext兩個(gè)接口,其中ApplicationContext是BeanFactory的子接口之一,換句話說(shuō)BeanFactory是Spring IoC容器所定義的最底層接口,而ApplicationContext是其高級(jí)接口之一,并且對(duì)BeanFactory功能做了許多有用的擴(kuò)展,所以在絕大部分的工作場(chǎng)景下,都會(huì)使用ApplicationContext作為Spring IoC容器。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容