依賴注入的實現方式:設值注入和構造方法注入


      SSH開發時,一般將項目分成3層:web層、service層和dao層。開發的基本流程是先定義dao接口,然后實現該接口,在定義同類型的service接口,再實現service接口(此時使用dao接口注入),接着再從web層去調用service層。

      dao層完成的是底層的數據庫操作,service層則完成純粹的業務邏輯,該層中的數據操作部分是通過注入的dao層來實現的。service層的作用是將從dao層取得的數據做更貼近業務的實現,dao層則只實現對數據的增、刪、改、查操作。使用這種分層方式更有利於項目的擴展和維護。

一、設值注入

      設值注入是指IoC容器使用setter方法注入被依賴的實例。通過調用無參構造器或無參static工廠方法實例化bean之后,調用該bean的setter方法,即可實現基於setter的DI。

  1.  新建項目,配置運行環境(Build Path中加入spring和其它依賴的jar包)
  2. User類,作為被保存的模型對象
    package com.deciphering.model;
    
    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;
        }
    }
    User.java
  3. User類的接口UserDAO(針對接口編程的好處是UserDAO可以有多個不同的實現類,分別用來操作不同的數據庫)
    package com.deciphering.dao;
    import com.deciphering.model.User;
    
    
    public interface UserDAO {
        public void save(User user);
    }
    UserDAO
  4. UserDAO的實現類UserDAOImpl(簡化處理)
    package com.deciphering.dao.impl;
    
    import com.deciphering.dao.UserDAO;
    import com.deciphering.model.User;
    
    
    public class UserDAOImpl implements UserDAO {
    
        public void save(User user) {
            
            System.out.println(user.getUsername() + " saved in Oracle!");        
            //System.out.println(user.getUsername() + " saved in DB2!");        
            //System.out.println(user.getUsername() + " saved in mysql!");
            
        }
    
    }
    UserDAOImpl
  5. 業務邏輯接口UserService
    package com.deciphering.service;
    import com.deciphering.dao.UserDAO;
    import com.deciphering.model.User;
    
    public class UserServiceImpl {
        
        private UserDAO userDAO;  
        
        public void add(User user) {
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        public void setUserDAO(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
    /*    public UserServiceImpl(UserDAO userDAO) {
            super();
            this.userDAO = userDAO;
        }
        */
    }
    UserService 
  6. 業務邏輯接口的實現類UserServiceImpl
    package com.deciphering.service;
    import com.deciphering.dao.UserDAO;
    import com.deciphering.model.User;
    
    public class UserServiceImpl implements UserService{
        
        private UserDAO userDAO;  
        
        public void add(User user){
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        public void setUserDAO(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
    }
  7. Spring的配置文件beans.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
               
      <bean id="u" class="com.deciphering.dao.impl.UserDAOImpl">
      </bean>
        
      <bean id="userService" class="com.deciphering.service.UserServiceImpl">     
           <property name="userDAO">
               <ref bean="u"/>
           </property> 
              
      </bean>
    </beans>
  8. 測試類
    Test
    package com.deciphering.service;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.deciphering.model.User;
    import com.deciphering.service.UserServiceImpl;
    
    public class UserServiceTest {
    
        @Test
        public void testAdd() throws Exception {
            
            ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
            UserServiceImpl service = (UserServiceImpl)ctx.getBean("userService");
        
            User u = new User();
            
            u.setUsername("測試用戶");
            u.setPassword("123456");
            
            service.add(u);
        }
        
    }

     

二、構造方法注入

      構造方法注入是指IoC容器使用構造方法來注入被依賴的實例。基於構造器的DI通過調用帶參數的構造方法來實現,每個參數代表着一個依賴。

      在上面的項目文件里,做少量的修改,即可變為構造方法注入。

  1. 修改UserServiceImpl類,在使用構造方法注入時,必須顯式的給出待參數的構造方法。
    package com.deciphering.service;
    import com.deciphering.dao.UserDAO;
    import com.deciphering.model.User;
    
    public class UserServiceImpl {
        
        private UserDAO userDAO;  
        
        public void add(User user) {
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        public void setUserDAO(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
    //定義構造方法
        public UserServiceImpl(UserDAO userDAO) {
            super();
            this.userDAO = userDAO;
        }
        
    }
  2. 修改beans.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
               
      <bean id="u" class="com.deciphering.dao.impl.UserDAOImpl">
      </bean>
        
      <bean id="userService" class="com.deciphering.service.UserServiceImpl">
            <!--
           <property name="userDAO">
               <ref bean="u"/>
           </property> 
           -->
     //使用構造方法注入,為UserService實例注入u實例     
           <constructor-arg>
               <ref bean="u"/>
           </constructor-arg>
           
           
      </bean>
     
    </beans>

    文件結構:

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM