首頁 > Java > java教程 > Spring IOC容器

Spring IOC容器

大家讲道理
發布: 2017-08-19 13:46:19
原創
1548 人瀏覽過

1.Spring框架簡介

什麼是Spring?

Spring是一個開源的輕量級的應用開發框架,其目的是用於簡化企業級應用程式開發,減少侵入

Spring提供的IOC和AOP應用,可以將元件的耦合度降至最低,即解耦,便於系統日後的維護和升級

Spring為系統提供了一個整體的解決方案,開發者可以利用它本身提供的功能外,也可以與第三方框架和技術整合應用,可以自由選擇採用哪種技術進行開發

2.容器和Bean管理

Spring容器簡介

#在Spring中,任何java類別和javaBean都被當成Bean處理,這些Bean透過容器管理和應用程式

Spring容器實作了IOC和AOP機制,這些機制可以簡化Bean物件建立和Bean物件之間的解耦

Spring容器有BeanFactory和ApplicationContext兩種類型

(什麼是javaBean:一種簡單規範的java物件;何時使用Spring:當需要管理javaBean物件時候就可以使用,Spring是最簡​​潔的物件管理方案之一)

Spring容器的實例化

ApplicationContext繼承自BeanFactory接口,擁有更多的企業級方法,推薦使用該類型,實例化方法如下:

# //載入檔案系統中的設定檔實例化

String conf = “C:\applicationContext.xml”;

ApplicationContext ac = new FileSystemXmlApplicationContext(conf);

//載入工程classpath下的設定檔實例化

String conf = “applicationContext.xml”;

ApplicationContext ac = new ClassPathXmlApplicationContext(conf);

## Spring容器的使用

從本質上講,BeanFactory和ApplicationContext僅僅只是一個維護Bean定義以及相互依賴關係的高階工廠介面。透過BeanFactory和ApplicationContext我們可以存取bean定義

首先在容器設定檔applicationContext.xml中加入Bean定義

然後在建立BeanFactory和ApplicationContext容器物件後,呼叫getBean()方法取得Bean的實例即可[getBean("識別碼")]

Bean的實例化

Spring容器建立Bean物件的方法有以下三種:#-用建構器來實例化

#

(id或name屬性用來指定Bean名稱,用來從Spring中尋找這個Bean物件;class用來指定Bean類型,會自動呼叫無參數建構器建立物件)-使用靜態工廠方法實例化

#

(id屬性用於指定Bean名稱,class屬性用於指定工廠類型,factory-method屬性用於指定工廠中建立Bean物件的方法,必須用static修飾的方法)-使用實例工廠方法實例化

##

# (id用於指定Bean名稱,factory-bean屬性用於指定工廠Bean物件,factory-method屬性用於指定工廠中建立Bean物件的方法)

(將物件建立規則告訴Spring,Spring會幫你去建立物件;基於設定和預設規則,減少了程式碼的書寫)

 Bean的命名

Bean的名稱:

在Spring容器中,每個Bean都需要有一個名字(即識別符),該名字可以用元素的id或name屬性指定;id屬性比name嚴格,要求具有唯一性,不允許用"/"等特殊字元

Bean的別名

#為已定義好的Bean,再增加另一個名字引用,可以使用

Bean的作用域:

#Spring容器在實例化Bean時,可以建立下列作用域的Bean物件

1、singleton作用域


在每個Spring IOC容器中一個bean定義對應一個物件實例,預設項目
設定實例:




2、prototype


一個bean定義對應多個物件實例
設定實例:




3、request

request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效


# request、session、global session使用的時候,首先要在初始化web的web.xml中做如下配置:


如果你使用的是Servlet 2.4及以上的web容器,那麼你只需要在web應用的XML宣告檔web.xml中增加下述ContextListener即可:
...org.springframework.web.context.request. RequestContextListener...

如果是Servlet2.4以前的web容器,那麼你要使用一個javax.servlet.Filter的實作:
.. requestContextFilter org.springframework.web.filter.RequestContextFilter<ter-class>org.springframework.web.filter.RequestContextFilter requestContextFilter /*/*...< ;/web-app>
接著既可以配置bean的作用域了:
4、session



session作用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean只在目前HTTP session內有效(在一個HTTPSession中,一個bean定義對應一個實例,僅限於Web環境)
配置實例:
和request配置實例​​的前提一樣,配置好web啟動文件就可以如下配置:
5、global session



在一個全域的HTTPSession中,一個bean定義對應一個實例,僅在基於portlet的Web應用中才有意義,Portlet規範定義了全域Session的概念

設定實例:

和request設定實例的前提一樣,設定好web啟動檔就可以如下設定:

(上面的Bean作用域,可以透過定義的scope屬性指定)

Bean的生命週期回呼

指定初始化回呼方法:

#

指定銷毀回呼方法,僅適用於singleton模式的bean:#########

##1 ##在頂級的元素中的default-init-method屬性,可以為容器所有指定初始化回調方法

  

#

在頂級的元素中的default-destroy-method屬性,可以為容器所有指定銷毀回呼方法

#

  

##

Bean延遲實例化

在ApplicationContext實作的預設行為就是在啟動時將所有singleton bean提前進行實例化#如果不想讓一個singleton bean在ApplicationContext初始化時被提前實例化,可以使用元素的lazy-init = "true" 屬性改變一個延遲初始化bean將在第一次被用到時實例化

在頂級的元素元素中的default-lazy-init屬性,可以為容器所有指定延遲實例化特性

指定bean依賴關係

當一個bean對另一個bean有依賴關係時,可以利用元素的depends-on屬性指定

當一個bean對多個bean存在依賴關係時,depends-on屬性可以指定多個bean名,用逗號隔開

3.容器的IOC應用

IOC概念#########IOC全名為Inversion of  Control,被翻譯為控制反轉;######IOC是指程式中物件的取得方式發生反轉,由最初的new方式創建,轉變為由第三方框架創建,注入。第三方框架一般是透過配置方式指定注入哪一個具體實現,從而降低了物件之間的耦合度######IOC按實現方法不同,可以分為依賴注入DI和依賴查找兩種### ###Spring容器是採用DI方式實現了IOC控制,IOC是Spring容器的基礎和核心##########DI概念#########DI全名為Dependency  Injection,被譯為依賴注入######DI的基本原理就是將一起工作具有關係的對象,透過建構方法參數或方法參數傳入建立聯繫,因此容器的工作就是在創建bean時注入那些依賴關係#### ##IOC是一種思想,而DI是實現IOC的主要技術途徑######DI主要有兩種注入方式,即Setter注入和建構器注入#########Setterr注入# ##############透過呼叫無參考構造器或無參音static工廠方法實例化bean之後,呼叫該bean的setter方法,即可實現setter方式的注入##### #######public class JDBCDataSource{######  private String driver;######  public void setDriver(String driver){######    try{{  

  

  

  

建構器注入

#基於建構器的注入是透過呼叫帶參數的構造器來實現的,容器在bean被實例化的時候,根據參數類型執行對應的建構器

public class OracleUserDAO implements UserDAO{

#  private JDBCDataSource dataSource;

  public OracleUserDAO(JDBCDataSource dataSource){

    this.dataSource = dataSource;

  }

 /

#  }

 //其他程式碼.....##//其他程式碼.....##}

按建構器參數索引指定注入

#

  

  

  

  

#

  < ;constructor-arg index = "0"  ref = "dataSource"/>

#

#自動組裝

#Spring  IOC容器可以自動組裝(autowire)相互協作bean之間的關聯關係,autowire可以針對單一bean進行設置,autowire的方便之處在於減少xml的注入配置

在xml設定檔中,可以在< ;bean/>元素中使用autowire屬性指定自動組裝規則,一共有五種類型值

#屬性值為no:

#禁止自動組裝,預設值;

屬性值為byName:根據屬性名稱自動裝配,此選項將檢查容器並根據名字查找與屬性完全一致的bean,並將其與屬性自動裝配;

屬性值為byType:如果容器中存在一個與指定屬性類型相同的bean,那麼將與該屬性自動組裝;

屬性值為constructor: 與byType的方式類似,不同之處在於它應用於建構器參數;

屬性值為autodetect:

透過bean類別來決定使用constructor還是byType方式進行自動裝配,如果發現預設的建構器,那麼將使用byType方式

設定範例:

  

#

#上述配置,在UserService中如果存在接收UserDao類型的方法Setter方法,Spring就可以自動將userDAO物件注入進去

#########

以上是Spring IOC容器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板