? 作為一枚大四準備畢業的學生,最重要的事便是畢業設計,前些日子剛剛拿到畢設題目:“3D網絡圖:面向網絡結構數據的可視化軟件設計”,(⊙o⊙)…,怎么說哪,看到題目就是一頭霧水(前幾屆不都是學生選課系統,學生教務管理系統嗎-_-||,說好的套路那),望著題目,看看在公司里要學的PeopleSoft,我去,毫無關系好嗎。在學校學了兩年JAVA,校外實習交了一萬多學習了JavaEE,找個工作去干了PeopleSoft-_-||,畢設又是可視化設計,唉,真是世事多變,人生無常啊。
? 好了,吐槽歸吐槽,為了吃飯,為了畢業什么都得慢慢來。仔細了解了一下題目:“本題目要求學生使用webGL技術開發一個用于數據可視化呈現的web應用軟件。網絡結構數據的可視化表現方式一直是數據可視化領域研究的重點。采用webGL技術,可以使用現代瀏覽器直接在網頁上呈現3D效果,為網絡結構數據可視化和交互設計提供了新的可能。”突然想起在學校的日子里對那些網頁上呈現3D效果代碼的著迷(也就在那時學了JS,甚至決定了以后校外實習的選擇),回想起那時的時光,看看現在做的PeopleSoft,理想和現實的差距還真是大o(╥﹏╥)o,大概熟悉了一下題目后和老師聊了聊,原來這次畢設和我的理想是那么的接近,那就開始做,而且要好好做,人不止是為了現實而活著,至少要向自己的理想邁出幾步。
? 首先老師讓先搭起一套框架,說實話不管是實習還是在大學,框架都沒有深入理解過(實習時剛學到JS,就找到工作,也沒想到會做PeopleSoft),那就從頭開始,慢慢來吧!
? 翻開好久不動的JAVA資料,打開好久沒看的JAVA視頻,學著學著突然有種想哭的沖動(不要問我為什么,就是很難過),以下便是我學習Spring的過程,以后會一直更新,直到把畢設做完。
? 首先我了解到Spring是一個社區,也是一個很大的項目,其中包含了很多子項目,我主要用到的是其中的核心項目Spring Framework。
??Spring-framework 框架是一個分層架構,它包含一系列的功能要素,并被分為大約20個模塊。這些模塊分為Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和測試部分,其中我主要去學習的是Core Container和AOP。
??
?一、 其中Spring中有兩個重要的概念:
IOC:Inversion of Control 控制反轉
spring核心容器也可以稱為IOC容器,該容器主要負責管理各種對象的聲明周期(對象的創建、初始化、銷毀等)
IOC容器并沒有實現更多的功能,但它的存在使我們不需要很多代碼、不需要考慮對象間復雜的耦合關系就能從IOC容器中獲取合適的對象,而且提供了各種對象的可靠的管理,極大地降低了開發的復雜性。
總結:
1.IOC意味著將你設計好的類交給了spring容器去控制,而不是在類的內部自己進行控制。
2.有IOC容器之后,剩下的工作只是在IOC容器中堆積木
3.之前項目中對象和對象之間的關系是直接寫死在代碼中的,而使用了IOC容器后則是在代碼中并沒有寫對象和對象是什么關系,而是把這種關系的建立交給了IOC容器去做,并且是在代碼運行的時候動態建立起來(我們可以通過配置文件進行任意改變)
4.IOC其實就是一種將調用者與被調用者分離的思想。
DI:Dependency Injection 依賴注入
DI的概念的提出是用來代替IOC的,表示讓調用類對某一接口實現類的依賴關系由容器注入,以移除調用類對某一接口實現類的依賴。(思考servlet和service層接口以及service層接口實現類這三者的關系)
依賴注入 這個名詞顯然比 控制反轉 更直接明了,并且易于理解。
?
二、對此有了了解后,下載Spring:
http://repo.springsource.org/libs-release-local/org/springframework/spring/3.2.4.RELEASE/spring-framework-3.2.4.RELEASE-dist.zip
直接粘到地址欄或者下載工具里,每次有更新只要改版本號就可以。
?
三、然后就是Spring的配置流程及需要理解的內容:
Spring IOC容器核心api(容器將來會是一個對象)
BeanFactory接口
BeanFactory是Spring中IOC容器的核心接口,主要用于處理Bean的初始化和配置,建立對象間的依賴關系
接口中主要方法如下:
//根據指定名稱返回一個Bean實例
Object getBean(String name)
//判斷名稱為name的Bean是否是原型,即是否總是返回一個新實例(非單例)
boolean isPrototype(String name)
//判斷名稱為name的Bean是否是單例
boolean isSingleton(String name)
//判斷容器中是否包含給定名稱的Bean實例
boolean containsBean(String name)
//如果名稱為name的Bean有別名則返回所以別名
String[] getAliases(String name)
ApplicationContext接口
該接口繼承于BeanFactory,增強了BeanFactory,增加了事務處理AOP,國際化,事件傳遞等功能
所以在代碼中我們一般會使用ApplicationContext接口,以及這個接口相應的實現類來創建spring的容器對象
例如:
String path = "com/briup/ioc/set/set.xml";
ApplicationContext container =
new ClassPathXmlApplicationContext(path);
Student s = (Student)container.getBean("student");
?
?四、配置文件
Spring通過讀取配置文件中的數據來對項目各個對象進行實例化,配置以及組裝,通常使用XML文件來作為配置文件
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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
</beans>
注意事項:
1.這個文件的頭部聲明可以在下載的spring文檔中的示例找到
2.這里面用到了倆個schema文件(.xsd文件),分別是spring-beans-3.2.xsd和spring-context-3.2.xsd,它們也可以在下載的spring文檔中找到
3.在Eclipse中把xml文件和schema文件關聯后,xml中就可以有標簽代碼的提示了(注意關聯時別配置錯了)
4.spring框架是模塊化的,之后使用其他模塊的時候,還可以在該xml的根元素中繼續引用其他模塊中相應的schema文件,然后就可以使用引入新模塊中的標簽代碼了
?
測試例子:
set方式注入(必須依靠set方法):
導入jar包:
創建兩個測試類,例如Student和Teacher,其中Teacher類中包含Student。
編寫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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd"><bean name="stu" class="com.briup.bean.Student"><property name="id" value="1"></property><property name="name" value="tom"></property><property name="age" value="20"></property></bean><bean name="teacher" class="com.briup.bean.Teacher"><property name="id" value="1"></property><property name="name" value="zhangsan"></property><property name="student" ref="stu"></property></bean>
寫測試方法:
public void ioc_set() {try {String[] path = {"com/briup/ioc/set/set.xml"};ApplicationContext container = new ClassPathXmlApplicationContext(path);Teacher t = (Teacher)container.getBean("teacher");System.out.println(t);System.out.println(t.getId());System.out.println(t.getName());System.out.println(t.getStudent());System.out.println("-------------");System.out.println(t.getStudent().getId());System.out.println(t.getStudent().getName());System.out.println(t.getStudent().getAge());} catch (Exception e) {e.printStackTrace();}}
這就是一個Spring實現控制反轉,依賴注入的例子。
? 總結(Spring):
1.降低耦合性(在一個類中運行時引入其他類,而不是直接new對象)
2.去除一些方法中重復代碼(例如日志文件,權限控制,事務處理(開事務,提交事務,異常事務處理) //需要這個代碼,但這個代碼又不能直接寫到這里)
spring可以在運行期間把代碼進行動態結合
3.管理對象的生命周期
4.spring核心容器中放入對象,這些對象被稱為bean(可重復使用的組件)
5.IOC:反轉,主動變被動
DI:依賴(依賴的解釋:例如web層依賴service層,service層依賴dao層)注入,DI的概念的提出是用來代替IOC的