Spring 新手教程(三) 注入和自己主動裝配

weixin_34015860發表於2017-05-19


     Spring注入是指在啟動Spring容器載入bean配置的時候。對類變數的賦值。

 

兩種經常使用注入方式:設值注入和構造注入


以下就這部分知識看程式碼以及程式碼中的註解:


1、首先看Spring 配置檔案(怎樣載入,怎麼測試,《入門系列(一)》有說明。這裡不再贅述

<?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" > <!-- 以下是設值注入 。注意 <property name="injectionDAO" ref="injectionDAO"></property>這行程式碼, 無論是這裡的設值還是以下的構造一定要在須要引用物件的類中加上對應的方法供Spring容器使用,實際開發中兩種僅僅須要選擇一種就可以 -> <!-- <bean id="injectionService" class="com.xidian.ioc.injection.service.InjectionServiceImpl"> --> <!-- <property name="injectionDAO" ref="injectionDAO"></property> --> <!-- </bean> --> <!--這裡是構造注入 --> <bean id="injectionService" class="com.xidian.ioc.injection.service.InjectionServiceImpl"> <constructor-arg name="injectionDAO" ref="injectionDAO"></constructor-arg> </bean> <bean id="injectionDAO" class="com.xidian.ioc.injection.dao.InjectionDAOImpl"></bean> </beans>


2、看待注入的類:

package com.xidian.ioc.injection.dao;

public interface InjectionDAO {
	
	public void save(String arg);
	
}

package com.xidian.ioc.injection.dao;

import com.xidian.ioc.injection.dao.InjectionDAO;

public class InjectionDAOImpl implements InjectionDAO {
	
	public void save(String arg) {
		//模擬資料庫儲存操作
		System.out.println("儲存資料:" + arg);
	}

}

3、Service類

package com.xidian.ioc.injection.service;

public interface InjectionService {
	
	public void save(String arg);
	
}

import com.xidian.ioc.injection.dao.InjectionDAO;

public class InjectionServiceImpl implements InjectionService {
	
	private InjectionDAO injectionDAO;
	
	//【重要】構造器注入 ,這種方法一定要有,假設在前面的spring上下文中是用構造注入的方法
	public InjectionServiceImpl(InjectionDAO injectionDAO1) {
		this.injectionDAO = injectionDAO1;
	}
	
	//【重要】設值注入,這種方法一定要有。並且名字一定要是setXxx。不然spring容器載入不出來
	public void setInjectionDAO(InjectionDAO injectionDAO) {
		this.injectionDAO = injectionDAO;
	}

	public void save(String arg) {
		//模擬業務操作
		System.out.println("Service接收引數:" + arg);
		arg = arg + ":" + this.hashCode();
		//Spring物件會自己主動調取生成對應的物件
		injectionDAO.save(arg);   
	}
	
}


自己主動裝配(Autowiring):

byname:依據屬性名自己主動裝配。

byType:假設容器中存在一個與該屬性名同樣的bean,那麼久自己主動裝配。可是。假設存在多個。則會丟擲異常;假設沒找到則不報異常。但什麼也不做。

Constructor:與byType方式類似,不同之處在於它應用於構造器引數,假設容器中沒有找到與構造器型別一致的bean。那麼則丟擲異常。

 

自己主動注入,把裝配的相關操作放到了詳細類中,要在對應的方法中傳入(該方法不能少),詳細細節看程式碼凝視:


1、Spring的配置檔案:

<?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" default-autowire="constructor"> <!--自己主動注入配置。還能夠有byName,byType。byName實際上是看bean的id; 而用byType則是看型別的。假設有多個同樣的type則報異常;實際上用自己主動注入時,省掉的是在以下的bean注入配置。 自己主動注入,把裝配的相關操作放到了詳細類中,要在對應的方法中傳入。--> <bean id="autoWiringService" class="com.xidian.autowiring.AutoWiringService" ></bean> <!-- 假設不是用自己主動注入的方法,這這邊必須人為的進行設定,比方這邊的方法: <bean id="autoWiringService" class="com.xidian.autowiring.AutoWiringService" > <property name="autoWiringDAO" ref="autoWiring"></property> </bean> --> <!-- 待注入的物件 --> <bean class="com.xidian.autowiring.AutoWiringDAO" ></bean> </beans>



2、待自己主動注入類:

package com.xidian.autowiring;


//該類被配置到了對應的配置檔案spring-autowiring.xml中。也就是待注入的物件類
public class AutoWiringDAO {
	
	public void say(String word) {
		System.out.println("AutoWiringDAO : " + word);
	}

}



3、注入類:

package com.xidian.autowiring;

//該類被配置到了對應的配置檔案其中spring-autowiring.xml
public class AutoWiringService {
	
	private AutoWiringDAO autoWiringDAO;
	
	//假設使用構造方法自己主動注入的方法,則這邊必須寫上這種方法。前面儘管免去的在Spring配置檔案bean的設定,可是這邊省不了。
	public AutoWiringService(AutoWiringDAO autoWiringDAO) {
		System.out.println("AutoWiringService");
		this.autoWiringDAO = autoWiringDAO;
	}

	//同上。必須有的方法 , 傳入AutoWiringDAO物件。

前面儘管免去的在spring配置檔案bean的設定。可是這邊省不了。 public void setAutoWiringDAO(AutoWiringDAO autoWiringDAO) { System.out.println("setAutoWiringDAO"); this.autoWiringDAO = autoWiringDAO; } public void say(String word) { this.autoWiringDAO.say(word); } }




你看會了嘛?歡迎討論 http://blog.csdn.net/code_7





相關文章