1. 程式人生 > >Spring詳解篇之IoC控制反轉

Spring詳解篇之IoC控制反轉

###一.Spring概況

  • spring是一個開源框架
  • 是一個輕量的控制反轉和麵向切面的容器框架
  • 大小和開銷都是輕量的。
  • 通過控制反轉技術可以達到鬆耦合的目的
  • 切面程式設計,允許通過分離應用的業務邏輯。
  • 包含並管理應用物件的配置和生命週期,是一個容器,並且能夠組裝。

ioc控制反轉:控制權轉移,應用程式本身不負責依賴物件的建立和維護,而是由外部容器負責和維護。ioc的目的是建立物件並且組裝物件之間的關係。

####1.bean容器初始化

  • –org.springframework.beans

  • –org.springframework.context

  • beanfactory 提供配置結構和基本功能,載入並初始化bean

  • applicationContext 儲存bean物件並在應用中被應用

2.spring注入:

  • spring 注入是指在啟動 spring容器載入bean配置的時候,完成對變數的賦值行為。
  • 常見的注入方式:設值注入、構建注入

舉個例子,構建注入

dao層

 
 

service 層介面:

 
 

service 層實現:

 
 

在spring xml中的配置

 
 

單元測試

本系列文章單元測試基類

 
 

單元測試:

 
 

執行列印:

Service接收引數:這是要儲存的資料

儲存資料:這是要儲存的資料:1247298779

這個例子說明,我們可以通過ClassPathXmlApplicationContext.getBean()獲取到了service,這個service 是通過xml配置注入到容器中,並且注入的時候通過建構函式的設定了成員變數dao。

####3.1 bean常見的配置項,如下:

  • Id
  • Class
  • Scope
  • Constructor arguments
  • Properties
  • Autowiring mode
  • lazy-initialization mode
  • Initialization/destruction method

3.2 bean的作用域

  • singleton: 單列
  • prototype每次使用都會建立新例項
  • request :每次http請求建立一個例項,僅在當前 request有效
  • session : 當前session有效

舉個例子:
測試sinleton和prototype

建立bean例項

 
 

在xml中配置,作用域為singleton

 
 

單元測試:

 
 

執行單元測試:

BeanScope say : 1113008012

BeanScope say : 1113008012

在xml中配置,作用域為prototype

 
 

執行單元測試

BeanScope say : 144724468

BeanScope say : 1432645272

由此可發現sington在bean容器是一個例項,而prototype建立了二個例項。

包括以下幾個方面:

  • 定義,在xml中配置
  • 初始化
  • 使用
  • 銷燬

初始化

有兩種方式

  • 實現 InitializingBeean介面,覆蓋afterPropertiesSet()
  • 配置init-method方法

銷燬

也有兩種方式:

  • 實現DisposableBean介面,覆蓋destroy();
  • 配置 destroy-method

舉個例子:

建立bean例項:

 
 

bean的配置:

 
 

單元測試:

 
 

執行:

Bean afterPropertiesSet.

Bean start .

Bean destroy.

Bean stop.

同時實現兩種方式的初始化方法的執行順序: 介面實現優先於xml中的配置。

  • No: 不做任何操作
  • byname:根據屬性名自動裝配
  • byType:如果容器存在一個與指定型別相同的bean,則自動裝配,雅思培訓一般多少錢如果存在多個,則丟擲異常。
  • constructor:與 byType類似,不同之處它在於構造器的引數。

舉例子:
1.byName方式:

建立一個dao:

 
 

建立一個service

 
 

在xml中配置:

 
 

單元測試:

 
 

執行:

setAutoWiringDAO

AutoWiringDAO : this is a test

通過default-autowire=“byName”;
AutoWiringService 自動獲取了autoWiringDAO的例項。

2.byTYpe

將在xml中配置改為byType :

 
 

其他不變,執行和byName 一樣。

3.constructor

 
 

AutoWiringService 中增加構造器

 
 

允行:

AutoWiringDAO : this is a test

從spring 3.0開始,spring javaConfig 專案提供了許多特性,包括使用java而不是xml

1.比如註解

@Configuration
@Bean
@Import
@DependsOn

@Component 是一個通用註解,應用於任何bean

@Reposity註解DAO

@Service註解service

@Controller註解controller

2.spring可以自動檢測類並註冊bean到applicationContext中。比如
@Service @Reposity等

3.< context:annoation-config />會查詢applicationContext中bean的註解。

掃描 :< context:component-scan> 包含< context:annoation-config/>,通常只需要使用前者。

 
 

舉個例子:
通過掃描獲取bean,在xml中的配置:

 
 

定義一個bean類:
其中scope 註解表示bean的作用域,預設singleton。Component預設類名並將第一個字母小寫。

 
 

單元測試:

 
 

執行:

BeanAnnotation : This is test.

  • @Autowired可以用於setter方法上
  • 可以用於成員變數
  • 可以用於構造器

舉個例子:

採用包掃描:

 
 

採用註解:DAO層

 
 

service層:

 
 

單元測試:

 
 

執行:

Service接收引數:This is autowired.

儲存資料:This is autowired.:1641742937

  • @Bean 標識一個用於配置和初始化一個由springIoC容器管理的新物件的方法,類似於 xml配置檔案的</ bean>

舉個例子:
用註解去代替xml檔案

 
 

javabean StringStore類

 
 

單元測試:

 
 

另外可以用ImportResource註解類獲取資原始檔資訊:

 
 
  • spring支援jsr-250
  • @Resource註解變數或者setter 方法
  • Resource註解有一個name屬性,預設該值作為被注入bean的名稱。