05 Spring IOC 容器
阿新 • • 發佈:2018-11-12
1. Spring IOC 容器
IOC(Inversion of Control) 控制權的轉移,應用程式本身不負責依賴的建立和維護,而由外部容器建立和維護 Spring IOC作用:專門負責物件的建立和依賴的管理注入
DI(Dependency Injection) 是一種IOC實現方式
DI 目的:建立物件並且組裝物件之間的關係
2004年,Martin Fowler 探討了一個問題,既然IOC是控制反轉,那麼到底是“哪些方面的控制被反轉了呢?”,經過詳細地分析和論證後,他得出了答案:“獲取依賴物件的過程被反轉了”。控制反轉之後,獲得依賴物件的過程由自身管理變為了IOC主動注入。於是,他給“控制反轉”取了一個更合適的名字叫做“依賴注入(Dependency Injection)”。他的這個答案實際上給出了實現IOC的方法:注入。所謂依賴注入,就是有IOC容器在執行期間,動態地將某個依賴關係注入到物件中。
比如生活中以前吃飯需要自己做,現在吃飯交給美團負責,我們只需要下單即可。比如租房我們需要自己找,現在交給58就好。
2. Spring IOC 容器中如何管理物件
想讓Bean讓IOC管理需要在IOC中配置即可,而Spring IOC中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" >
<bean id="exampleBean" class="com.javaee.ExampleBean">
</bean>
</beans>
註解
@Service 等註解
3. Spring Bean 容器初始化
Spring IOC 容器中配置好Bean後如何獲取Bean物件?Spring Bean容器中獲取Bean物件有如下方式:
- 檔案方式
- Classpath 方式
- WEB方式
檔案方式
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("F:/spring.xml");
Classpath方式
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
WEB方式
WEB 方式適用於WEB專案,需要在web.xml檔案中配置即可
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
4. Spring 注入
Spring 注入是指在啟動Spring 容器載入Bean配置的時候,完成對變數賦值行為。Spring注入分兩種注入方式;
- 設值注入(屬性注入)
- 構造注入
- 工廠方法注入
4.1 屬性注入
<bean id="productService" class="com.javaee.spring.service.ProductService">
<!-- name 當前類中需要提供一個setXxxx方法 -->
<!-- ref 引入其他bean的Id -->
<property name="productDao" ref="productDao" />
</bean>
<bean id="productDao" class="com.javaee.spring.dao.ProductDao">
</bean>
4.2 構造注入
<bean id="productService" class="com.javaee.spring.service.ProductService">
<constructor-arg name="productDao" ref="productDao" />
</bean>
<bean id="productDao" class="com.javaee.spring.dao.ProductDao">
</bean>
注意
構造方法注入必須提提供對應引數的構造方法