以例子的形式講解Spring的IOC(控制反轉)與DI(依賴注入)

1、什麼是控制反轉?

簡而言之,就是把對象的創建權由我們之前的手動創建現在由Spring容器來處理,對象創建的控制權發生了反轉,故而得名控制反轉,Inversion Of Control(IOC);

2、什麼叫依賴注入?

Dependency Injection是控制反轉的核心,就是把我們對象之間的依賴關係交由我們Spring容器來進行管理,也就是說動態的向某個對象提供他需要的其他對象;

3、在我們實際程序中哪裏使用到了我們的控制反轉與依賴注入?

在以下例子中,我們創建了userDao、userService接口以及其實現類,我們都知道dao用來處理持久層,也就是操作數據庫,而業務層service用來操作Dao層,所以我們寫了幾個方法來模擬這個過程;

public interface IuserDao {
	public void findByUsernameAndPassowrd();
}
public class IuserDaoImpl implements IuserDao{

	public void findByUsernameAndPassowrd() {
		// TODO Auto-generated method stub
		System.out.println("這裏是dao層的方法");
	}
	

}
public interface IuserService {
	//因爲在業務層的話一般是可以處理登錄請求的,故寫一個登錄的方法
	public void login();
}
public class UserServiceImpl implements IuserService{
	//在這裏我們定義一個成員變量,變量名應該對xml文件中的name相對應;
	private IuserDao userDao;
	//這裏給他添加一個set方法
	public void setUserDao(IuserDao userDao) {
		this.userDao = userDao;
	}

	public void login() {
		// TODO Auto-generated method stub
		System.out.println("這裏業務層service的 方法");
		System.out.println("這裏是通過依賴注入打印出來的方法");
	//使用Spring配置方式new一個對象,IOC控制反轉
		//讀取Applicationcontext.xml文件,獲取Bean節點
//		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//		//根據ID來獲取Bean,並且對其進行強轉
//		IuserDao userDao=(IuserDao)ac.getBean("userDao");
		//然後使用這個userDao對象來調用裏面的那個方法
		userDao.findByUsernameAndPassowrd();
		
	}

}

關於Service層調用Dao層對象(控制反轉)

在以上代碼中我們可以看到我們在業務層中調用了數據層Dao裏面的方法,而我們這裏沒有選擇直接在Service層創建對象,而是把對象的創建過程交給了我們的spring容器,也就是在我們的applicationContext.xml進行配置,在裏面通過bean進行創建對象,並且這個創建對象的過程使用到了我們的java反射機制,只要提供dao接口的實現類全路徑,就能創建出其dao對象,然後我們在service層使用Appplication對其進行獲取,從而可使用該對象對其進行調用dao層裏面的方法;

關於我們在test類中訪問service對象(依賴注入)

因爲我們在test方法裏面需要訪問service對象,故我們在applicationContext.xml中對對象進行注入;

<!-- 這裏的話直接把上面那個對象進行依賴注入,也就是相當於用了set/get方法 -->
<bean id="userService" class="com.runxun.UserServiceImpl">
	<property name="userDao" ref="userDao"></property>
</bean>

注意:我們這裏需要使用property對userDao進行注入,這個name必須是我們在seivice層實現類中的創建的dao層對象名,並且給其添加一個set方法,通過該方法進行依賴注入之後在service實現類中我們就可以直接使用該dao對象來調用Dao層裏面的方法而無須像之前一樣使用applicationContext進行對象獲取;
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章