1. 程式人生 > >深入淺出Spring(四) Spring例項分析

深入淺出Spring(四) Spring例項分析

   上次的博文中 深入淺出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文章)。

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框架修改之後的相關類圖,具體如下:

       看完上面類圖之後,我們對比於第一張類圖,可以看出:類與類之間的相互依賴更少,這樣的結構能夠使我們的程式碼耦合性更低。但這張類圖的程式碼究竟是如何實現的呢?接下來,重點看一下我們需要修改的目標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的理解。

      給大家提供一個博文配套的參考例項程式碼下載地址:

轉載請註明出處:http://www.cnblogs.com/zs234/