Spring學習總結(二)---談談對Spring IOC的理解(二:程式碼實現例項)
阿新 • • 發佈:2018-12-22
日期: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的情況下同樣完成了與傳統的程式設計思想同樣的功能。