springIoC概述

概述

       在java開發領域spring框架非常有名,尤其是在java領域,如果不知道spring框架,你就太low了(當然牛逼到爆的人除外)。spring框架的英文名就是springFramework,翻譯過來就是spring框架。spring框架其實只是SpringSource公司的一個項目,SpringSource公司有很多項目,這是項目主頁,你會看到非常多多項目。但是springFramework是最基礎的,也就是最核心的。基礎和核心的就是其他spring項目都要依賴springFramework項目,換句話說其他項目都是在springFramework的基礎之上延伸出來的。
spring項目關係圖
       其他項目和springFrameWork的關係就是這樣的。Spring還有其他很多東西,比如它的歷史什麼的,讀者可以閒暇時自己百度。關於它的優點我會慢慢道來。

1IoC容器

1.1介紹

       容器(container)這個詞感覺已經被濫用了,什麼都是容器。容器顧名思義就是裝東西的東西。例如水杯是一個容器,用來裝水。IoC容器就是用來裝應用中的對象實例。注意我強調的是對象,這意味着同一類型的對象你可以在IoC容器中放好幾個。IoC容器中,IoC的意思就是Inversion of Control(控制反轉)。首先明確一下這裏的控制是控制什麼?這裏的控制範範的說就是控制對象的生命週期,明確到一個典型點來說就是對象的實例化,再具體一點來說就是將對象依賴的其它對象傳遞給該對象。在一般情況下,建立一個對象都是通過new,靜態方法,工廠方法等等手段。springFramework採用了一種比較高效的機制,它將實例化好的對象全部存在一個類似map結構的容器當中,每一個key都對應一個實例化對象。

Object0 obj0 = new Object0();
Object1 obj1 = new Object1();
Object2 obj2 = new Object2();
Object3 obj3 = new Object3();
Object4 obj4 = new Object4();
Object5 obj5 = new Object5();
Object6 obj6 = new
Object6(obj0,obj1,obj2,obj3,obj3,obj4,obj5); 

採用springFramework之前的管理對象的方法。

public class obj6{
@Autowired
public Object0 obj0
@Autowired
public Object1 obj1
@Autowired
public Object2 obj2
@Autowired
public Object3 obj3
@Autowired
public Object4 obj4
@Autowired
public Object5 obj5
}
public class Boot{
    public static void main(String[] argv){
    IoC ioc = new IoC();
    Object0 obj0 = new Object();
    ioc.put("obj0",obj0);
    Object1 obj1 = new Object();
    ioc.put("obj1",obj1);
    Object2 obj2 = new Object();
    ioc.put("obj2",obj2);
    Object3 obj3 = new Object();
    ioc.put("obj3",obj3);
    Object4 obj4 = new Object();
    ioc.put("obj4",obj4);
    Object5 obj5 = new Object();
    ioc.put("obj5",obj5);
    Object6 obj6 = ioc.getBean(Object6.class);
    }
}

採用springFramework之後使用IoC容器來管理對象。
       初看之下,發現採用IoC容器似乎要更加麻煩,要多寫很多代碼,但假設一下,這些對象的重用率非常高,這樣的話,通過傳遞IoC容器就可以在不同的函數中使用這些對象。當然這個優點非常牽強,使用起來也非常不方便,在實際的開發中並不會傳遞IoC容器,是通過註解的方式來獲取IoC容器中的對象,這樣就非常方便。但這裏要強調的是IoC容器的強大之處在於對象生命週期的管理,這裏面涉及到很多知識,包括前面提到的註解,在下面的文章中會詳細介紹。本文的重點是springFramework的使用和背後的思想,並不會深究springFramework的實現。

1.2IoC容器的實現

之前只是闡述了IoC容器的思想,現在介紹一下IoC容器在springframework中的實現。

BeanFactory

Bean工廠,bean只的就是對象實例。bean其實沒有任何限制,並不需要它的類有set和get方法,只是一半情況下因爲習慣和其他一些因素,都會加上set和get方法。BeanFactory就是IoC容器的最基本實現,可以實現存放對象的功能。BeanFactory只會在極少(我至今都沒有見過使用BeanFactory的情況)的情況下使用。一般情況下都會使用ApplicationContext,因爲BeanFactory的功能實在太基礎類,也就是太弱了。

ApplicationContext

ApplicationContext是IoC容器的另一個實現,當然是在BeanFactory基礎上的擴展。ApplicationContext包含了很多強大的功能,能夠更加精確的控制對象的生命週期,加載資源等等。

1.3如何定義一個對象實例

       因爲對象需要裝填到IoC容器中,因此目前最迫切的事情就是實例化一個對象。實例化一個對象有多種方式,spring將其分爲來兩類,一類是通過xml的方式來實例化一個對象,另一種是通過代碼,也就是new關鍵字,工廠方法等形式來實例化一個對象,當然隨着springFramework的發展,極力推薦採用通過代碼的形式實例化對象。因此我會採用拋磚引玉的方式,先講磚,而且會一帶而過,因爲不想在磚上話太多時間,也完全沒有必要。在這裏xml形式就是磚。

1.2.1通過XML實例化對象

現在我不會講解具體實踐的細節,比如這個demo需要哪些jar,xml放在哪裏等等。

<?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.xsd">
    <bean id="user" class="org.liu.spring.entity.User">
        <property name="id" value="1"/>
        <property name="name" value="liu"/>
        <property name="password" value="pass"/>
    </bean>
</beans>
public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        User user = context.getBean(User.class);
        System.out.println(user.getName());
    }
}

着差不多就是spring基於XML的HelloWorld了,但是我覺的還是麻煩,因爲得配置一個麻煩的xml,及其容易讓人出錯。
這是這個項目的地址
好了,到這裏爲止,磚已經介紹完了,該講玉了。就是採用java編寫代碼的形式使用對象實例的定義。

1.2.2通過JAVAConfig實例化對象

之前採用的是從classpath加載xml配置,因此採用ClassPathXmlApplicationContext.現在採用javaConfig的形式就需要一種新的ApplicationContext了,就是AnnotationConfigApplicationContext。

public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        User user = context.getBean(User.class);
        System.out.println( user.getName());
    }
}

這是項目地址.這個強烈建議下載下來。
採用javaConfig的目錄結構

採用XML的形式
少了一個xml是令人多麼爽,我個人對xml深惡痛絕。
這裏主要爲讓這個示例項目講解一下,App和AppConfig不要放在默認的包路徑下,一定要有包名。App顧名思義就是應用程序的執行類,擁有main函數。AppConfig就是配置類,這個配置類特殊一點,有一個@ComponentScan註解,用於掃描其它帶有註解的類。因此一定要將帶有@ComponentScan的類房子比較頂級的包路徑下,雖然@ComponentScan是可配置的,但是爲例省事不出錯,就放在頂級目錄下用默認配置就好。因爲使用的是AnnotationConfigApplicationContext,這個context有個特點就是會把帶有@Configuration的類作爲配置類。在這個項目中首先將AppConfig添加到了context中,然後AppConfig聲明瞭@ComponentScan會把所有帶有註解到類掃描進來,這其中就包括config包下帶有@Configuration的配置類。在這個類中配置類一個Pserson的實例對象,因此可以在App中可以直接獲通過context獲取到Person的實例。

小結

本章只是介紹類IoC容器的概念,以及在springIoC容器的使用。

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