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的名稱。