依赖注入的实现方式:设值注入和构造方法注入

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>

文件结构:

时间: 2025-01-22 09:43:13

依赖注入的实现方式:设值注入和构造方法注入的相关文章

【Spring】Spring依赖注入IOC的设值注入setter

其实标题中如此高大上的名词,只是一个问题,关于在Spring的applicationContext.xml中的如下语句是什么意思? <property name="aService" ref="aService"/> 这类语句在SSH的配置中会大量存在,因为Spring所谓的核心机制就是Spring依赖注入IOC.下面举一个例子说明这个问题: 先贴上目录结构: 在Eclipse中新建一个Java工程,不是JavaWeb,在这个Java配置好Spring3

【Spring实战】—— 5 设值注入

本篇主要讲解了Spring的最常用的功能——依赖注入. 注入的方式,是使用Getter Setter注入,平时大多的编程也都是使用这种方法. 举个简单的例子,还是表演者. 表演者有自己的属性,年龄或者表演的歌曲等等.还需要一些复杂的属性,比如乐器,每一种乐器会发出不同的声音. 下面看一下表演者Performer package com.spring.test.action1; public interface Performer { void perform() throws Performan

spring框架IOC设值注入

spring以动态的形式来管理对象,注入分为两种: 1. 设置注入:直观  自然 2.构造注入:可以在构造器中决定依赖顺序 以下就是示例: 1.User实体类 package com.domain; import java.io.Serializable; /** * * @author Mr * 实体类 */ public class User implements Serializable { private Integer id; private String uname; private

Spring接口编程_设值注入和构造注入

说明: UserManagerImp是设值注入,UserManagerImp2是构造注入 接口不注入,也就是在Spring配置文件中没有接口的<bean>,但是定义的时候是用接口 private IUserDao userDao; IUserManager userManager2=(IUserManager) factory.getBean("userManager2"); 类都注入,①UserManagerImp和UserManagerImp2属于实现类 ②UserDa

依赖注入的实现方式

1.构造方法注入 顾名思义,构造方法注入,就是被注入对象可以通过在其构造方法中声明依赖对象的参数列表,让外部(通常是IoC容器)知道它需要哪些依赖对象. IoC Service Provider 会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象.同一个对象是不可能被构造两次的,因此,被注入对象的构造乃至其整个生命周期,应该是由IoC Service Provider 来管理的. 构造方法注入方式比较直观,对象被构造完成后,即进入就绪状态,可以马上使用. 2.sett

SpringFramework|@Qualifier 设值注入&amp;构造注入

@Qualifier 设值注入&构造注入 前述 Java: 1.8 Maven: 3 SpringFramework版本以及各组件成员: 5.1.1.RELEASE spring-context spring-core spring-beans 可能会有这样一种情况,当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱. 示例(

Asp.NetCore依赖注入和管道方式的异常处理及日志记录

原文:Asp.NetCore依赖注入和管道方式的异常处理及日志记录 前言 ????在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog 组件进行记录:同时,还将介绍两种不同的 异常捕获方式:管道捕获/服务过滤:通过本练习,将学习到如何捕获异常.处理异常跳转.记录异常信息. 1. 搭建框架 ????首先,创建一个 WebApi 项目,选择 Asp.Net Core W

Spring JavaBean属性值的注入方式( 属性注入, 特殊字符注入 &lt;![CDATA[ 带有特殊字符的值 ]]&gt; , 构造器注入 )

<?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.or

依赖注入三种方式(待完成)

1.set方法注入 通过setter方法注入:类中一定要提供相应的setXX方法,才能执行成功 <!-- 通过属性注入(setter方法) name表示类中的属性名,类中必须有对应的set方法--> <bean name="user1" class="cn.itcast.spring.h_beanproperty.User"> <property name="id" value="1">&l