1. 程式人生 > >spring--配置詳解

spring--配置詳解

本博文參考傳智播客、黑馬程式設計師視訊講座

IoC(控制反轉)

Inverse of Control
控制反轉,把本來由程式設計師建立物件和依賴注入的工作轉交給spring完成。

DI(依賴注入)

Dependency Injection

注入方式:set方法注入+構造方法注入+欄位注入(相當於類成員是public,可以直接呼叫賦值)

注入型別:值型別注入(8種基本資料型別)+引用型別注入

spring容器

在這裡插入圖片描述

BeanFactory介面(每次獲取物件時才會建立物件)
ApplicationContext介面:(每次容器啟動時就會建立容器中配置的所有物件),一般從類路徑下載入配置檔案ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

也可以從硬碟絕對路徑載入配置檔案ApplicationContext ac = new FileSystemXmlApplicationContext("硬碟上的絕對路徑");

由於BeanFactory介面是在獲取物件的時候才建立物件,而ApplicationContext在容器啟動的時候就把配置檔案中配置的物件都創建出來了,那就比較耗費資源了,又由於硬體發展的比較好了,一般直接用ApplicationContext容器,因為其功能比原始的BeanFactory強大的多。除非是硬體資源非常匱乏的情況下,才會考慮用BeanFactory。

spring配置詳解—Bean元素

<!-- 把User物件交給spring容器管理 -->
<!-- Bean元素:spring容器所管理的物件的資訊
			 class屬性:被管理物件的全限定名
			 name屬性:被管理物件的名字,可重複,可使用特殊字元,(建議用name而不是id)
			 id屬性:與name屬性類似,不可重複,不可使用特殊字元
 -->
<bean name="user" class="cn.ccnuacmhdu.bean.User"></bean>

Bean的scope屬性

常用的兩個值:singleton(預設)和prototype

singleton:在spring容器中只有一個物件例項
prototype:多例,每次獲得都會建立一個新的例項

在這裡插入圖片描述
在這裡插入圖片描述

另外還有request屬性值和session屬性值,在web環境下,物件與request或session生命週期一致。

Bean的生命週期屬性

init-method方法:spring在建立物件之後立即呼叫
destroy-method方法:spring在銷燬所有容器物件之前呼叫

<bean name="user" class="cn.ccnuacmhdu.bean.User" init-method="init" destroy-method="destroy"></bean>

在這裡插入圖片描述

在這裡插入圖片描述

spring配置詳解—建立物件的方式

工程依舊使用原來的工程:https://blog.csdn.net/ccnuacmhdu/article/details/84988785

空參構造

為User物件提供空參構造方法,證明spring預設使用空參構造建立物件。

public User() {
		System.out.println("空參構造方法。。。");
	}

在這裡插入圖片描述

其他方式還有靜態工廠方式(呼叫靜態工廠的某個靜態方法建立物件)和例項工廠模式(呼叫例項工廠中的某個非靜態方法建立物件),瞭解下即可,具體配置方式略。

spring配置詳解—模組化配置

主配置檔案中引入其他spring配置檔案:
<import resource="去掉src之前的路徑後剩下的路徑/applicationContext.xml"/>

spring配置詳解—屬性注入方式

set方法注入

<bean name="user" class="cn.ccnuacmhdu.bean.User">
		<!-- 為User物件的屬性注入值 -->
		<property name="name" value="Tom"></property>
		<property name="age" value="19"></property>
	</bean>

在這裡插入圖片描述

構造方法注入

提供構造方法:

public User(String name, Car car) {
		super();
		this.name = name;
		this.car = car;
	}

書寫配置檔案:

<bean name="car" class="cn.ccnuacmhdu.bean.Car">
		<property name="name" value="大眾"></property>
		<property name="price" value="120"></property>
	</bean>
	
	<!-- 構造方法注入  -->
	<bean name="user2" class="cn.ccnuacmhdu.bean.User">
		<constructor-arg name="name" value="Lucy"></constructor-arg>
		<constructor-arg name="car" ref="car"></constructor-arg>
	</bean>

注意:如果配置檔案中還存在剛才的user配置,並且user僅僅提供了一個構造方法,沒有提供空參構造。由於只要在配置檔案中配置了user,spring容器就會去建立他,必定要通過空參構造,但是找不到空參構造,報錯!!!

變態情況1

user有下面兩個構造方法

public User(String name, Car car) {
		super();
		this.name = name;
		this.car = car;
	}
	public User(Car car, String name) {
		super();
		this.name = name;
		this.car = car;
	}

用index屬性指定形參順序,確定使用哪個構造方法:
在這裡插入圖片描述

變態情況2

在這裡插入圖片描述
指定每個引數的型別:
在這裡插入圖片描述

複雜型別注入

package cn.ccnuacmhdu.bean;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class Collection {
	private Object[] arr;
	private List list;
	private Map map;
	private Properties props;
	public Object[] getArr() {
		return arr;
	}
	public void setArr(Object[] arr) {
		this.arr = arr;
	}
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	public Map getMap() {
		return map;
	}
	public void setMap(Map map) {
		this.map = map;
	}
	public Properties getProps() {
		return props;
	}
	public void setProps(Properties props) {
		this.props = props;
	}
	@Override
	public String toString() {
		return "Collection [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", props=" + props + "]";
	}
	
}

<!-- 複雜型別注入 -->
	<!-- 陣列 -->
	<bean name="collection" class="cn.ccnuacmhdu.bean.Collection">
		<!-- 陣列只有一個元素的時候可以用下面這一句程式碼 -->
		<!-- <property name="arr" value="Tom"></property> -->

		<!-- 多個元素注入 -->
		<property name="arr">
			<array>
				<value>lucy</value>
				<value>jack</value>
				<ref bean="car" />
			</array>
		</property>
		
		<!-- list只有一個元素的時候可以用下面這一句程式碼 -->
		<!-- <property name="list" value="jack"></property> -->
		
		<property name="list">
			<list>
				<value>lucy</value>
				<value>jack</value>
				<ref bean="car" />
			</list>
		</property>
		
		<property name="map">
			<map>
				<entry key="key1" value="value1"></entry>
				<entry key="key1" value-ref="car"></entry>
				<entry key-ref="car" value-ref="car"></entry>
			</map>
		</property>
		
		<property name="props">
			<props>
				<prop key="name">name</prop>
				<prop key="password">password</prop>
			</props>
		</property>
		
	</bean>

在這裡插入圖片描述
另外還有p名稱空間注入和spel方式注入,具體略。

註解配置代替XML

略。