概述
在java開發領域spring框架非常有名,尤其是在java領域,如果不知道spring框架,你就太low了(當然牛逼到爆的人除外)。spring框架的英文名就是springFramework,翻譯過來就是spring框架。spring框架其實只是SpringSource公司的一個項目,SpringSource公司有很多項目,這是項目主頁,你會看到非常多多項目。但是springFramework是最基礎的,也就是最核心的。基礎和核心的就是其他spring項目都要依賴springFramework項目,換句話說其他項目都是在springFramework的基礎之上延伸出來的。
其他項目和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());
}
}
這是項目地址.這個強烈建議下載下來。
少了一個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容器的使用。