上次的博文中 深入淺出Spring(二) IoC詳解 和 深入淺出Spring(三) AOP詳解中,我們分別介紹了一下Spring框架的兩個核心一個是IoC,一個是AOP。接下來我們來做一個Spring的實例。
為了更好的講解Spring的相關內容,這次的博文會針對一個【添加用戶】的實例,進行逐步的解剖和優化,再此過程中,細節內容大家不需要考慮,只需要加深對Spring的理解即可。
1、實例一
首先,我們來看一個沒有使用任何Spring框架內容,比較單純的添加用戶的實例。先看一下相關的類圖和實現代碼,具體如下:
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } public interface UserDao { public void addUser(User user); } public class UserDao4OracleImpl implements UserDao { @Override public void addUser(User user) { System.out.println("UserDao4OracleImpl.addUser() , username="+user.getUsername()); } } public class UserDao4MySqlImpl implements UserDao { @Override public void addUser(User user) { System.out.println("UserDao4MySqlImpl.addUser() , username="+user.getUsername()); } } public interface UserManager { public void addUser(User user); } public class UserManagerImpl implements UserManager { @Override public void addUser(User user) { UserDao userDao = new UserDao4MySqlImpl(); userDao.addUser(user); } } public class Client { public static void main(String[] args) { User user = new User(); user.setUsername("張三"); user.setPassword("123456"); UserManager userManager = new UserManagerImpl(); userManager.addUser(user); } }
分析上面的類圖和代碼中,我們可以很明顯的看出:在UserManagerImpl類的方法addUser中,UserManagerImpl調用了UserDao及其具體的實現類UserDao4MySqlImpl,這就不符合IoC模式中,將接口的具體實現類的控制權從調用類中分離轉交給第三方決定的相關思想,所以我們需要在這裡進行修改。(參考我們之前的IoC文章)。
URL:http://www.bianceng.cn/Programming/Java/201410/45838.htm
2、實例二
針對實例一中不符合IoC思想的部分,我們進行相關修改,具體修改之後的相關類圖和代碼如下:
public class UserManagerImpl implements UserManager { private UserDao userDao; public UserManagerImpl (UserDao userDao){ this.UserDao = userDao; } @Override public void addUser(User user) { this.userDao.addUser(user); } } public class Client { public static void main(String[] args) { User user = new User(); user.setUsername("張三"); user.setPassword("123456"); UserDao userDao = new UserDao4MySqlImpl(); UserManager userManager = new UserManagerImpl(userDao); userManager.addUser(user); } }
分析上面修改之後的類圖和代碼,我們發現,雖然我們將UserDao的控制權交給了Client,但在Client中卻存在對UserDao及其相關實現類的依賴,這樣對於Client來講,Client類與UserDao類之間的耦合性反而不如我們之前寫的代碼低。如何優化呢?我們這裡就不做太多的思考,直接使用Spring的相關內容即可。
3、實例三
對於實例二的問題,先來看一下我們使用Spring框架修改之後的相關類圖,具體如下:
URL:http://www.bianceng.cn/Programming/Java/201410/45838.htm
看完上面類圖之後,我們對比於第一張類圖,可以看出:類與類之間的相互依賴更少,這樣的結構能夠使我們的代碼耦合性更低。但這張類圖的代碼究竟是如何實現的呢?接下來,重點看一下我們需要修改的目標Client類的相關代碼,具體如下:
public class Client { public static void main(String[] args) { User user = new User(); user.setUsername("張三"); user.setPassword("123456"); BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); UserManager userManager = (UserManager)factory.getBean("userManager"); userManager.addUser(user); } }
通過對比上面的代碼和我們第二個實例中關於Client類的代碼可以看出,上面的代碼用到了一個BeanFactory類和XML文件,這就是Spring框架使用的核心類和實現方式。了解了兩者的區別,我們再看一下XML文件中都寫了什麼,具體如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="userDao4MySqlImpl" class="com.zs.spring.dao.UserDao4MySqlImpl" /> <bean id="userManager" class="com.zs.spring.manager.UserManagerImpl"> <property name="userDao" ref="userDao4MySqlImpl" /> </bean> </beans>
關於這個XML文件,我會在接下來的文章中重點進行講解,這裡只告訴大家,它的作用就是將對象之間的依賴關系交由Spring容器進行控制,避免硬編碼所造成的過度程序耦合。即相當於下面的兩句代碼:
UserManager userManager = new UserManagerImpl(userDao); UserDao userDao = new UserDao4MySqlImpl();
4、總結
對比上面的三張類圖,我們可以看到,使用Spring框架, 將對象之間的依賴關系交由Spring容器進行控制,通過使用XML文件將對象之間的調用關系從代碼中分離,避免硬編碼所造成的過度程序耦合,這正是Spring框架實現解耦的核心思想。
到此為止,關於Spring的實例就講解完畢了,講解的不是很細,大家只需要對Spring框架有一個初步的認識即可。至於Spring運行過程中的具體實現,我會在下次的博文中繼續講解,以便加深大家對Spring的理解。
給大家提供一個博文配套的參考實例代碼下載地址:
spring_01.zip:
http://download.csdn.net/detail/zs15932616453/6013995
出處:http://www.cnblogs.com/zs234/