依赖注入(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的缺点,而应该是优点。
原文地址:https://www.cnblogs.com/coder-ahao/p/14225776.html