依賴注入(DI)的三種實現方式


本文來探討一下依賴注入的三種實現方式是哪三種,Spring的支持又怎么樣。

首先,依賴注入(DI)的實現方式有三種:設值注入、構造方法注入、接口注入,下面來看看這三種注入方式在Spring中的支持怎么樣。

1、設值注入。

   ①、新建一個項目

   ②、新建一個User類,實現setter、getter方法

 

  1.  
    package com.bean;
  2.  
     
  3.  
    public class User {
  4.  
    String username;
  5.  
    String password;
  6.  
    public String getUsername() {
  7.  
    return username;
  8.  
    }
  9.  
    public void setUsername(String username) {
  10.  
    this.username = username;
  11.  
    }
  12.  
    public String getPassword() {
  13.  
    return password;
  14.  
    }
  15.  
    public void setPassword(String password) {
  16.  
    this.password = password;
  17.  
    }
  18.  
     
  19.  
    }

 

 

 

 

 

   ③、新建一個接口,名字為UserDAO,里面包含一個save方法,將信息存入數據庫

 

  1.  
    package com.dao;
  2.  
     
  3.  
    import com.bean.User;
  4.  
     
  5.  
    public interface UserDAO {
  6.  
    public void save(User user);
  7.  
    }

 

 

    ④、新建一個UserDAO的實現類UserDAOImpl,實現save方法,模擬數據庫存入

 

  1.  
    package com.dao;
  2.  
     
  3.  
    import com.bean.User;
  4.  
     
  5.  
    public class UserDAOImpl implements UserDAO {
  6.  
     
  7.  
    @Override
  8.  
    public void save(User user) {
  9.  
    // TODO Auto-generated method stub
  10.  
    System.out.println(user.getUsername()+ "被存儲");
  11.  
    }
  12.  
     
  13.  
    }

 

 

    ⑤、為了不將直接操作數據庫的對象UserDAO暴露給用戶,需添加service層,在數據庫操作前后添加業務邏輯。
先實現業務邏輯接口UserService:

 

  1.  
    package com.bean;
  2.  
     
  3.  
    public interface UserService {
  4.  
    public void add(User user);
  5.  
    }

 

 

然后再寫這個接口的實現類UserServiceImpl:

 

  1.  
    package com.bean;
  2.  
     
  3.  
    import com.dao.UserDAO;
  4.  
     
  5.  
    public class UserServiceImpl implements UserService {
  6.  
     
  7.  
    private UserDAO userDAO;
  8.  
     
  9.  
    public UserDAO getUserDAO() {
  10.  
    return userDAO;
  11.  
    }
  12.  
     
  13.  
    //設值注入 為UserDAO的注入做准備
  14.  
    public void setUserDAO(UserDAO userDAO) {
  15.  
    this.userDAO = userDAO;
  16.  
    }
  17.  
    //實現負責業務邏輯的add方法
  18.  
    @Override
  19.  
    public void add(User user) {
  20.  
    // TODO Auto-generated method stub
  21.  
    userDAO.save(user);
  22.  
    }
  23.  
     
  24.  
    }

 

 

 


    ⑥、在src下創建Spring配置文件,命名為applicationContext.xml,在其中配置數據訪問類和業務邏輯實現類:
  1.  
    <?xml version= "1.0" encoding="UTF-8"?>
  2.  
    <beans xmlns= "http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  3.  
    xmlns:tx= "http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
  4.  
    xmlns:cache= "http://www.springframework.org/schema/cache"
  5.  
    xsi:schemaLocation= "
  6.  
    http://www.springframework.org/schema/context
  7.  
    http://www.springframework.org/schema/context/spring-context.xsd
  8.  
    http://www.springframework.org/schema/beans
  9.  
    http://www.springframework.org/schema/beans/spring-beans.xsd
  10.  
    http://www.springframework.org/schema/tx
  11.  
    http://www.springframework.org/schema/tx/spring-tx.xsd
  12.  
    http://www.springframework.org/schema/jdbc
  13.  
    http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
  14.  
    http://www.springframework.org/schema/cache
  15.  
    http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
  16.  
    http://www.springframework.org/schema/aop
  17.  
    http://www.springframework.org/schema/aop/spring-aop.xsd
  18.  
    http://www.springframework.org/schema/util
  19.  
    http://www.springframework.org/schema/util/spring-util.xsd">
  20.  
    <!-- 配置數據訪問類,實例名稱為u -->
  21.  
    <bean id= "u" class="com.dao.UserDAOImpl">
  22.  
    </bean>
  23.  
    <bean id= "user" class="com.bean.User">
  24.  
    </bean>
  25.  
     
  26.  
    <!-- 設值注入 配置業務邏輯實現類,實例名稱為userService-->
  27.  
    <bean id= "userService" class="com.bean.UserServiceImpl">
  28.  
    <!-- 在這里實現注入,注入實例名稱為u的實例到該實例的userDAO屬性 -->
  29.  
    <property name= "userDAO">
  30.  
    <ref bean= "u" />
  31.  
    </property>
  32.  
    </bean>
  33.  
    </beans>


 
    ⑦、寫一個測試方法進行測試(為了簡潔,這里沒有加上測試類,也沒有引入包,讀者寫的時候需要注意)
  1.  
    //設值注入測試
  2.  
        public static void setValDI(){
  3.  
            //初始化容器
  4.  
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  5.  
            UserServiceImpl service = (UserServiceImpl)ctx.getBean( "userService");
  6.  
            User u=(User)ctx.getBean( "user");
  7.  
            u.setPassword( "123456");
  8.  
            u.setUsername( "test");
  9.  
            service.add(u);
  10.  
        }
 
2、構造方法注入
    ①、修改UserServiceImpl類 加上構造方法
  1.  
    package com.bean;
  2.  
     
  3.  
    import com.dao.UserDAO;
  4.  
     
  5.  
    public class UserServiceImpl implements UserService {
  6.  
     
  7.  
    private UserDAO userDAO;
  8.  
     
  9.  
    public UserDAO getUserDAO() {
  10.  
    return userDAO;
  11.  
    }
  12.  
     
  13.  
    public void setUserDAO(UserDAO userDAO) {
  14.  
    this.userDAO = userDAO;
  15.  
    }
  16.  
     
  17.  
    //如果需要構造方法注入 則這里必須寫上構造方法
  18.  
    public UserServiceImpl(UserDAO userDAO) {
  19.  
    super();
  20.  
    this.userDAO = userDAO;
  21.  
    }
  22.  
     
  23.  
    @Override
  24.  
    public void add(User user) {
  25.  
    // TODO Auto-generated method stub
  26.  
    userDAO.save(user);
  27.  
    }
  28.  
     
  29.  
    }
  30.  
     
    ②、修改配置文件apllicationContext.xml
  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  3.  
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
  4.  
    xmlns:cache="http://www.springframework.org/schema/cache"
  5.  
    xsi:schemaLocation="
  6.  
    http://www.springframework.org/schema/context
  7.  
    http://www.springframework.org/schema/context/spring-context.xsd
  8.  
    http://www.springframework.org/schema/beans
  9.  
    http://www.springframework.org/schema/beans/spring-beans.xsd
  10.  
    http://www.springframework.org/schema/tx
  11.  
    http://www.springframework.org/schema/tx/spring-tx.xsd
  12.  
    http://www.springframework.org/schema/jdbc
  13.  
    http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
  14.  
    http://www.springframework.org/schema/cache
  15.  
    http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
  16.  
    http://www.springframework.org/schema/aop
  17.  
    http://www.springframework.org/schema/aop/spring-aop.xsd
  18.  
    http://www.springframework.org/schema/util
  19.  
    http://www.springframework.org/schema/util/spring-util.xsd">
  20.  
    <bean id="u" class="com.dao.UserDAOImpl">
  21.  
    </bean>
  22.  
    <bean id="userService" class="user.bean.UserServiceImpl">
  23.  
    <!-- 構造注入 -->
  24.  
    <constructor-arg>
  25.  
    <ref bean="u"/>
  26.  
    </constructor-arg>
  27.  
    </bean>
  28.  
    </beans>
    ③、寫測試方法進行測試(略)
3、接口注入
    由於接口注入會使類之間形成一定的依賴關系,產生侵入性,所以Spring不支持接口注入,這不是Spring的缺點,而應該是優點。


免責聲明!

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



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