1. 程式人生 > >Spring學習總結(二)---談談對Spring IOC的理解(二:程式碼實現例項)

Spring學習總結(二)---談談對Spring IOC的理解(二:程式碼實現例項)

日期:2016-9-4

內容:實戰演練Spring的Ioc和DI

一、傳統的程式設計思想:

這裡的傳統程式設計方式也是面向介面的程式設計。

1、UserDao.java:

package com.formal.dao;
/** 
 * @author  Administrator: 
 * @version 建立時間:2016-9-4 下午7:42:08 
 * 類說明 
 */
public interface UserDao {

	//模擬儲存資料
	public void save(String data);
}

2、UserDaoImpl.java:

package com.formal.dao.Impl;

import com.formal.dao.UserDao;

/** 
 * @author  Administrator: 
 * @version 建立時間:2016-9-4 下午7:43:21 
 * 類說明 
 */
public class UserDaoImpl implements UserDao {

	@Override
	public void save(String data) {
		System.out.println("儲存的資料:"+data);
	}

}

3、UserService.java:

package com.formal.service;
/** 
 * @author  Administrator: 
 * @version 建立時間:2016-9-4 下午7:47:13 
 * 類說明 
 */
public interface UserService {

	//業務類:模擬資料儲存
	public void save(String data);
}

4、UserServiceImpl.java:

package com.formal.service.Impl;

import com.formal.dao.UserDao;
import com.formal.dao.Impl.UserDaoImpl;
import com.formal.service.UserService;

/** 
 * @author  Administrator: 
 * @version 建立時間:2016-9-4 下午7:47:40 
 * 類說明 
 */
public class UserServiceImpl implements UserService {

	//呼叫Dao裡的userDao:但是這裡的先獲得相應dao的例項(傳統的程式設計是通過new關鍵字獲得例項的)
	private UserDao userDao;
	
	@Override
	public void save(String data) {
		//獲得物件例項
		userDao = new UserDaoImpl();
		
		//呼叫UserDao的save方法儲存資料
		userDao.save(data);
	}

}

5、單體測試:TestFormal.java:

package com.formal.test;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.formal.service.UserService;
import com.formal.service.Impl.UserServiceImpl;

/** 
 * @author  Administrator: 
 * @version 建立時間:2016-9-4 下午7:52:50 
 * 類說明 
 */
public class TestFormal {

	//例項化一個Service類
	private UserService userService;
	
	@Before
	public void before()
	{
		userService = new UserServiceImpl();
		
		System.out.println("初始化完成......");
	}
	
	@After
	public void after()
	{
		System.out.println("程式執行完成......");
	}
	
	@Test
	public void test()
	{
		String data = "這是模擬儲存的資料...";
		//呼叫save方法儲存資料
		userService.save(data);
	}
}

6、單體測試結果:

7、解析:傳統開發中的弊端

在傳統的程式設計思想中,當應用程式需要去使用一個類的例項的時候就要自己主動new一個物件然後才可以使用。如下:

使用這種程式設計方式看上去很簡單明瞭,但是隱藏的一個弊端就是增加了開發中的程式碼的耦合性,而且也降低了系統的效能(當系統很龐大的時候表現很明顯)。

二、使用Spring的IOC和DI的程式設計思想:

這個例子使用Spring的註解的方式完成,當然使用配置檔案的形式也是可以完成的。這個看個人習慣。

1、UserDao.java:

package com.spring.dao;

/** 
 * @author  Administrator: 
 * @version 建立時間:2016-9-4 下午7:42:08 
 * 類說明 
 */
public interface UserDao {

	//模擬儲存資料
	public void save(String data);
}

2、UserDaoImpl.java:

package com.spring.dao.Impl;

import org.springframework.stereotype.Repository;

import com.spring.dao.UserDao;


/** 
 * @author  Administrator: 
 * @version 建立時間:2016-9-4 下午9:06:01 
 * 類說明 
 */
@Repository("userDao")
public class UserDaoImpl implements UserDao {

	@Override
	public void save(String data) {
		System.out.println("使用Spring儲存的資料:"+data);
	}

}


3、UserService.java:

package com.spring.service;
/** 
 * @author  Administrator: 
 * @version 建立時間:2016-9-4 下午9:07:10 
 * 類說明 
 */
public interface UserService {

	//業務類:模擬資料儲存
	public void save(String data);
}


4、UserServiceImpl.java:

package com.spring.service.Impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.spring.dao.UserDao;
import com.spring.service.UserService;


/** 
 * @author  Administrator: 
 * @version 建立時間:2016-9-4 下午9:08:27 
 * 類說明 
 */
@Service("userService")
public class UserServiceImpl implements UserService {

	@Autowired
	private UserDao userDao;
	
	@Override
	public void save(String data) {
		//呼叫UserDao的save方法儲存資料
		userDao.save(data);
	}
}


5、applicationContext.xml配置檔案:

  <context:component-scan base-package="com.spring"></context:component-scan>


6、測試檔案TestSpring.java:

package com.spring.test;


import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


//import com.formal.service.Impl.UserServiceImpl;
import com.spring.service.UserService;
import com.spring.service.Impl.UserServiceImpl;


/** 
 * @author  Administrator: 
 * @version 建立時間:2016-9-4 下午9:16:19 
 * 類說明 
 */
public class TestSpring {


<span style="white-space:pre">	</span>//初始化業務類
<span style="white-space:pre">	</span>private UserService userService;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>@Before
<span style="white-space:pre">	</span>public void before()
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>//載入Spring配置檔案
<span style="white-space:pre">		</span>ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
<span style="white-space:pre">		</span>
<span style="white-space:pre">		</span>//從Spring容器中獲得例項
<span style="white-space:pre">		</span>userService = (UserService)ac.getBean("userService");
<span style="white-space:pre">		</span>
<span style="white-space:pre">		</span>System.out.println("系統初始化完成......");
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>@Test
<span style="white-space:pre">	</span>public void test()
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>//呼叫業務類儲存資料
<span style="white-space:pre">		</span>String data = "測試spring的IOC原理";
<span style="white-space:pre">		</span>
<span style="white-space:pre">		</span>//儲存資料
<span style="white-space:pre">		</span>userService.save(data);
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>@After
<span style="white-space:pre">	</span>public void after()
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>System.out.println("執行完成......");
<span style="white-space:pre">	</span>}
}


7、解析:

在使用Spring的IOC的情況下同樣完成了與傳統的程式設計思想同樣的功能。

三、總結:

在嘗試使用了兩種方式完成了相同功能的情況下,總結如下: ①、在使用傳統的程式設計方式的時候當我們需要外部資源(可以理解為某一個類或者介面)為我們效力的時候,是我們應用程式主動去new一個類,得到這個類之後我們就可以讓它為我們幹活了。 這樣做的弊端在上文已經闡述過了,在這裡就不再贅述。 ②、相對於傳統的程式設計方式最大的區別,我們的Spring為我們提供了一個強大的容器---IOC容器,在我們程式設計的過程中,可以將我們的類註冊到IOC容器中,在我們的應用程式需要使用這個類的例項的時候,可以直接去我們的容器中申請使用。關於如何例項化的我們的應用程式無需去管這方面的問題。我們只需要去使用就行了。 如上圖所示:我們使用A的方式將這個類在IOC容器中註冊,使用B的方式將UserDao這個類例項注入到我們的UserService中,這樣UserService就可以免費使用UserDao為我們的UserService服務了。 基本總結如上兩點,假如有什麼不對的地方希望各位博友批評指教,謝謝大家!