標籤:
註:本文來自於網路或者老師的總結資料,本人僅為摘錄,想瞭解更多相關資料,可以關註:
http://blog.csdn.net/pu_xubo565599455
什麼是spring架構?
Spring 是一個開源架構,是一種整合性的架構,是為瞭解決公司專屬應用程式程式開發複雜性而建立的。架構的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件,同時為 J2EE 應用程式開發提供整合的架構。至03年spring架構發布以來到現在pring架構已經發展成JavaEE開發中的非常重要的一個架構。雖然還是有公司採用自己的方式來處理代碼間的耦合問題,但是他們採用的方式依舊是Spring架構的基礎,即:原廠模式與服務定位器模式等。
Spring是為公司專屬應用程式開發提供的一個輕量級解決方案,包括:基於依賴注入的核心機制,基於AOP的聲明式事務(聯想下編程式事務),整合多種持久層技術的整合,整合很多優秀的WEB MVC架構等。Spring是致力於JavaEE應用各層的解決方案,而不是單單針對某一層。Spring貫穿表現層,業務層,持久層,但是Spring並不想取代那些已有的架構,而是以高度的開發性與它們無縫整合。
spring架構優點?
1、 低侵入式設計,代碼的汙染極低。
2、 Spring容器降低了業務對象替換的複雜性,提高了組件之間的解耦。
3、 Spring的AOP支援允許將一些通用任務如:安全,事務,日誌等進行集中式處理,從而提供了更好的複用。
4、 Spring的ORM和DAO提供了與第三方持久化架構的良好整合,並簡化了底層的資料庫訪問。
5、 Spring的高度開發性,並不強制應用完全依賴於Spring,開發人員可自由選擇Spring架構的部分或全部。
spring--IOC
IOC 即 Inversion Of Control,控制反轉或者稱之為依賴注入。IoC 不是一種技術,只是一種思想,一個重要的物件導向編程的法則,它能指導我們如何設計出松耦合、更優良的程式。在工作中, JAVA執行個體的調用者通過new關鍵字來建立被調用者的JAVA執行個體,程式高度耦合,效率低下,真實的應用極少使用這種方式,一般是初學者最喜歡。有了IoC容器後,把建立和尋找依賴對象的控制權交給了容器,由容器進行注入組合對象,所以對象與對象之間是 鬆散耦合,這樣也方便測試,利於功能複用,更重要的是使得程式的整個體繫結構變得非常靈活。依賴注入是目前最優秀的解耦方式,依賴注入讓Spring的Bean以設定檔群組織在一起,而不是以硬式編碼方式耦合在一起。
依賴注入通常有如下兩種方式:
設值注入:IOC容器使用屬性的Setter方法來注入被依賴的執行個體。
構造注入:IOC容器使用構造器來注入被依賴的執行個體。
設值注入:
設值注入是指IOC容器使用屬性的Setter方法來注入被依賴的執行個體。這種注入方式簡單、直觀,因而在Spring的依賴注入裡大量使用。
例外:
注意:Spring推薦面向介面編程,可以更好的讓規範和實現分離,從而提供更好的解耦,對於一個JAVAEE應用,不管是DAO組件,還是商務邏輯組件,都應該先定義一個介面,該介面定義組件應該實現的功能,但是功能的實現則由其實作類別提供。
我們先定義2個介面,如:
然後,分別實現其實作類別,如:
最後,我們在applicationContext.xml的<beans></beans>中分別配置2個JAVABEAN執行個體,並配置其關係管理。如:
在設定檔中,Spring配置Bean執行個體通常會指定2個屬性:
Id:指定該Bean的唯一標識,程式通過ID屬性值來訪問該BEAN執行個體。
Class:指定該BEAN的實作類別,此處不可再用介面,必須使用實作類別,Spring容器會使用XML解析器讀取該屬性值,並利用反射來建立該實作類別的執行個體。
從上面的樣本中,可以分析出,依賴注入以設定檔管理BEAN執行個體之間的耦合,讓BEAN執行個體之間的耦合從代碼層次分離出來,依賴注入是一種優秀的解耦方式。
分析得到SpringIOC容器的3個基本要點:
1、 應用程式的各組件面向介面編程。面向介面編程可以將各組件之間的耦合提示到介面層次,從而有利於項目後期的發展。
2、 應用程式的各組件不再由程式主動產生,而是由Spring容器來負責產生、並初始化。
3、 Spring採用設定檔、或Annotation來管理Bean的實作類別、依賴關係,Spring容器則根據設定檔、利用反射來建立執行個體,並為之注入依賴關係。
構造注入:
前面我們介紹,通過setter方法為目標Bean注入依賴關係的方式,被稱為設值注入:另外還有一種注入方式,這種方式在構造執行個體時,已經為其完成了依賴關係的初始化。這種利用構造器來設定依賴關係的方式,被稱之為構造注入。
import com.lovo.beans.CardInfoT;
import com.lovo.dao.ICardDao;
import com.lovo.service.ICardService;
public class CardServiceImpl implements ICardService {
private ICardDao cardDaoImpl;
//預設的構造器,如果要設定有參構造,需要先顯示執行無參構造
public CardServiceImpl(){
}
/**
* 構造注入所需的帶參數的構造器
* @param cardDao
*/
public CardServiceImpl(ICardDao cardDao){
this.cardDaoImpl = cardDao;
}
public void saveCard(CardInfoT card) {
// TODO Auto-generated method stub
cardDaoImpl.saveCard(card);
}
}
applicationContext.xml中添加配置為:
<!-- 由spring容器建立執行個體化對象,並管理對象之間的關係 -->
<bean id="cardDaoImpl" class="com.lovo.dao.impl.CardDaoImpl"></bean>
<!-- spring構造注入-->
<bean id="cardServiceImpl" class="com.lovo.service.impl.CardServiceImpl">
<!-- 使用構造注入,為 cardServiceImpl執行個體注入cardDaoImpl執行個體-->
<constructor-arg ref="cardDaoImpl"></constructor-arg>
</bean>
兩種注入方式的對比:
Spring同時支援兩種依賴注入方式:設定注入和構造注入。兩種注入方式,並沒有絕對的好壞之分,只是適應的情境有所不同。
相比之下,設定注入具有如下優點:
1、 與傳統的JavaBean的寫法更相識,程式開發人員更容易理解、接受、通過setter方式設定依賴關係顯得更加直觀、自然。
2、 對於複雜的依賴關係,如果採用構造注入,會導致構造器過於臃腫,難以閱讀。Spring在建立Bean執行個體時,需要同時執行個體化其依賴的全部執行個體,因而導致效能下降。而使用設定注入,則可以避免。
3、 尤其是在某些屬性可選的情況下,多參數的構造器更加笨重。
當然,構造注入也不是絕對不如設值注入,某些特定的場合,構造更適合。構造也有如下優點:
1、 構造注入可以在構造器中決定依賴關係的注入順序,優先依賴的優先注入,常常需要依賴於Datasource的注入。採用構造注入,可以在代碼中清晰地決定注入順序。
2、 對於依賴關係無須變化的Bean,構造注入更有用處。因為沒有setter方法,所有的依賴關係全部在構造器中設定,因此,無須擔心後續的代碼對依賴關係產生破壞。
3、 依賴關係只能在構造器中設定,則只有組件的建立者才能改變組件的依賴關係。對組件的調用者而言,組件內部的依賴關係完全透明,更符合高內聚的原則。
建議採用以設值注入為主,構造注入為輔的注入策略。對於依賴關係無須變化的注入,盡量採用構造注入;而其他的依賴關係的注入,則考慮採用設值注入。
Spring 容器
Spring提供了兩個核心介面:BeanFactory和ApplicationContext,其中applicationContext是BeanFactory的子介面。他們都可代表Spring容器,Spring容器是產生Bean執行個體的工廠,並管理容器中的Bean。Bean是Spring管理的基本單位,在基於Spring的JavaEE應用中,所有的組件都被當成Bean處理,包括資料來源、Hibernate的SessionFactory、交易管理員等。
BeanFactory:
Spring容器最基本的介面就是BeanFactory,該介面負責配置、建立,管理Bean,它有一個子介面;AppcationContext,也被稱為Spring上下文。Spring容器還負責管理Bean與Bean之間的依賴關係。
調用者只需使用getBean()方法即可獲得指定Bean的引用,無須關心Bean的執行個體化過程。
BeanFactory有一個常見的實作類別:org.springframework.beans.factory.xml.XmlBeanFactory類。
ApplicationContext是BeanFactory的子介面,對於大部分JavaEE應用而言,使用它作為Spring容器更方便。其常見實作類別是:FileSystemXmlApplicationContext、ClassPathXmlApplicationContext和AnnotataionConfigApplicationContext。如果在web應用中使用Spring容器,通常有XmlWebApplicationContext、AnnotatioinConfigWebApplicationContext兩個實作類別。
大部分的JavaEE應用,可以在啟動WEB應用時自動載入ApplicationContext執行個體,接受Spring管理的Bean無須知道ApplicationContext的存在,一樣可以利用ApplicationContext的管理。對於獨立的應用程式,也可通過如下方法來執行個體化BeanFactory。
1、
//搜尋當前檔案路徑下的beans.xml檔案建立Resource對象
InputStreamResource isr = new FileSystemResource(“beans.xml”);
//以Resource對象作為參數,建立BeanFactory對象
XmlBeanFactory factory = new XmlBeanFactory(isr);
或者採用:
2、
//搜尋類載入路徑,以類載入路徑下的beans.xml檔案建立Resource對象
ClassPathResource res = new ClassPathResource(“beans.xml”);
//以Resource對象作為參數,建立BeanFactory對象
XmlBeanFactory factory = new XmlBeanFactory(res);
如果需要同時載入多個XML設定檔,則可以採用如下方式:
//搜尋CLASSPATH路徑,以CLASSPATH路徑下的applicationContext.xml、Bean.xml、Service.xml檔案建立ApplicationContext
ApplicationContext appContext = new ClassPathXmlApplicaation(new String[“beans.xml”,”service.xml”]);
ApplicationContext:
大部分時候,我們都不會使用BeanFactory執行個體作為Spring 容器,而是使用ApplicationContext執行個體作為容器,因此我們也把Spring容器稱為Spring上下文。ApplicationContext是BeanFactory介面的子介面,它增強了BeanFactory的功能。
ApplicationContext允許以聲明式方式操作容器,無須手動建立它。可利用如ContextLoader的支援類,在WEB應用啟動時自動建立ApplicationContext。當前,也可以採用編程方式建立ApplicationContext.
BeanFactory與ApplicationContext執行個體化容器中Bean的時機不同,前者等到程式需要Bean執行個體時才建立,而後者在容器建立ApplicationContext執行個體時,會預初始化容器中的全部Bean。
因為採用ApplicationContext作為Spring容器,建立容器時會同時建立容器中所有singleton範圍Bean,因此可能需要更多的系統開銷。但一旦建立成功,應用後面的響應速度就會更快,因此,對於普通的JavaEE應用,推薦使用ApplicationContext作為Spring容器。
實際上Spring允許singleton作用的Bean指定lazy-init=”true”,該屬性將改變singleton Bean執行個體的預設行為,強製取消該Bean執行個體預初始化,則該Bean將不會隨著ApplicationContext啟動而預執行個體化。
java----spring架構