1. 程式人生 > >05 Spring IOC 容器

05 Spring IOC 容器

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配置有兩種:

  1. xml配置
  2. 註解配置

配置檔案配置

<?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物件有如下方式:

  1. 檔案方式
  2. Classpath 方式
  3. 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注入分兩種注入方式;

  1. 設值注入(屬性注入)
  2. 構造注入
  3. 工廠方法注入

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>

注意
構造方法注入必須提提供對應引數的構造方法