控制反轉 (IoC)
如果直接使用 new 來建立物件,那麼應用和資源是直接建立聯絡的。如果使用工廠模式,工廠會提供相應的物件資源給應用,降低了程式間的耦合。
- 只能降低耦合,並不能完全消除。
- 把建立物件的權利交給了框架。*
使用 spring 實現控制反轉
- 建立一個maven專案,並新增依賴
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>spring.selflearning</groupId>
<artifactId>day01_eesy_03spring</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
</dependency>
</dependencies>
</project>
- 建立配置檔案
在這個配置檔案裡寫入可重用元件的id
resources/bean.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 物件建立交給spring -->
<bean id="accountService" class="spring.selflearning.service.impl.AccountServiceImpl"></bean>
<bean id="accountDao" class="spring.selflearning.dao.impl.AccountDaoImpl"></bean>
</beans>
- 表現層利用spring建立IoC容器,獲取所需物件
package spring.selflearning.ui;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.selflearning.dao.IAccountDao;
import spring.selflearning.service.IAccountService;
import spring.selflearning.service.impl.AccountServiceImpl;
/*
模擬表現層,用於呼叫業務層
*/
/*
獲取Spring 的 IoC 核心容器,並根據id獲取物件
*/
public class Client {
public static void main(String[] args) {
// 獲取核心容器物件
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
// 根據id獲取bean物件
IAccountService as = (IAccountService) ac.getBean("accountService");
IAccountDao adao = ac.getBean("accountDao",IAccountDao.class);
System.out.println(as);
System.out.println(adao);
as.saveAccount();
}
}
ApplicationContext
三個常用實現類
ClassPathXmlApplicationContext
- 載入類路徑下的配置檔案
- 實際開發中推薦使用這個
FileSystemXmlApplicationContext
- 載入磁碟任意路徑下的配置檔案
AnnotationConfigApplicationContext
- 用於讀取註解建立容器
ApplicationContext 與 BeanFactory 的區別
- ApplicationContext 建立核心容器時,在讀取完配置檔案內容後立即建立配置檔案中的配置物件
- 建立單例物件時適用
- BeanFactory 建立核心容器時,延遲載入建立物件,即使用
getBean()
根據id獲取物件時才建立物件- 建立多例物件時適用
建立bean物件的三種方式
在bean.xml
檔案中,我們使用<bean></bean>
標籤來配置物件的id和class屬性。
這是第一種方式:
<bean id="accountService" class="spring.selflearning.service.impl.AccountServiceImpl"></bean>
直接使用這種方法配置要建立物件的屬性,物件所屬類中必須有預設的建構函式,否則無法正常建立物件。
有時在java內建的jar包裡,或者在他人建立的類中,沒有預設建構函式。這種情況下我們需要使用第二種方式,即先獲取該類,再透過factory-bean
和factory-method
屬性來建立所需的物件。
<!-- 這是一個模擬工廠類,可能存在於jar包中,也可能在他人建立的類中-->
<bean id="instanceFactory" class="spring.selflearning.factory.InstanceFactory"></bean>
<!-- 獲取相應的工廠和工廠內要建立物件對應的方法-->
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
第三中方式用於建立靜態工廠類靜態方法的物件:class
中獲取靜態類,factory-method
中定義靜態方法。
<bean id="accountService" class = "spring.selflearning.factory.StaticFactory" factory-method="getAccountService"></bean>
</beans>
Bean 的其他屬性
- scope: 作用範圍
- 取值:singleton, prototype, request, session, global-session
- bean 物件生命週期
- singleton: 和容器相同
- prototype: 物件建立是開始,物件長時間不用時,由Java垃圾回收器回收。
- inti-method:物件初始化
- destory-method:物件銷燬
本作品採用《CC 協議》,轉載必須註明作者和本文連結