zoukankan      html  css  js  c++  java
  • Spring依赖注入的三种实现方式

    依赖注入(Dependency Injection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念。

    当某个JAVA实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的实例(例如,使用 new 关键字获得被调用者实例),而使用Spring框架后,被调用者的实例不再由调用者创建,而是由 Spring 容器创建,这称为控制反转。

    Spring 容器在创建被调用者的实例时,会自动将调用者需要的对象实例注入给调用者,这样,调用者通过 Spring 容器获得被调用者实例,这称为依赖注入。

    依赖注入主要有两种实现方式,分别是属性 setter 注入和构造方法注入。具体介绍如下。

    1)属性 setter 注入

    指 IoC 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参 static 工厂方法实例化 bean 后,调用该 bean 的 setter 方法,即可实现基于 setter 的 DI。

    1. 创建 PersonService 接口

    在 springDemo01 项目的 com.mengma.ioc 包下创建一个名为 PersonService 的接口,该接口中包含一个 addPerson() 方法,如下所示。

    1.  
      package com.mengma.ioc;
    2.  
      public interface PersonService {
    3.  
      public void addPerson();
    4.  
      }

    2. 创建接口实现类 PersonServiceImpl

    在 com.mengma.ioc 包下创建一个名为 PersonServiceImpl 的类,该类实现了 PersonService 接口,如下所示。 

    1.  
      package com.mengma.ioc;
    2.  
      public class PersonServiceImpl implements PersonService {
    3.  
      // 定义接口声明
    4.  
      private PersonDao personDao;
    5.  
      // 提供set()方法,用于依赖注入
    6.  
      public void setPersonDao(PersonDao personDao) {
    7.  
      this.personDao = personDao;
    8.  
      }
    9.  
      // 实现PersonService接口的方法
    10.  
      @Override
    11.  
      public void addPerson() {
    12.  
      personDao.add(); // 调用PersonDao中的add()方法
    13.  
      System.out.println("addPerson()执行了...");
    14.  
      }
    15.  
      }

    上述代码中,首先声明了 personDao 对象,并为其添加 setter 方法,用于依赖注入,然后实现了 PersonDao 接口的 addPerson() 方法,并在方法中调用 save() 方法和输出一条语句。

    3. 在 applicationContext.xml 中添加配置信息

    在 applicationContext.xml 配置文件中添加一个 <bean> 元素,用于实例化 PersonServiceImpl 类,并将 personDao 的实例注入到 personService 中,其实现代码如下所示: 

    1.  
      <bean id="personService" class="com.mengma.ioc.PersonServiceImpl">
    2.  
      <!-- 将personDao实例注入personService实例中 -->
    3.  
      <property name="personDao" ref="personDao"/>
    4.  
      </bean>

    4. 编写测试方法

    在 FirstTest 类中创建一个名为 test2() 的方法,编辑后如下所示: 

    1.  
      public void test2() {
    2.  
      // 定义Spring配置文件的路径
    3.  
      String xmlPath = "applicationContext.xml";
    4.  
      // 初始化Spring容器,加载配置文件
    5.  
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
    6.  
      xmlPath);
    7.  
      // 通过容器获取personService实例
    8.  
      PersonService personService = (PersonService) applicationContext
    9.  
      .getBean("personService");
    10.  
      // 调用personService的addPerson()方法
    11.  
      personService.addPerson();
    12.  
      }

    2)构造方法注入

    指 IoC 容器使用构造方法注入被依赖的实例。基于构造器的 DI 通过调用带参数的构造方法实现,每个参数代表一个依赖。

      2.1 创建接口实现类 PersonServiceImpl

    1.  
      package com.mengma.ioc;
    2.  
      public class PersonServiceImpl implements PersonService {
    3.  
      // 定义接口声明
    4.  
      private PersonDao personDao;
    5.  
      // 提供有参构造器,用于依赖注入
    6.  
      public PersonServiceImpl(PersonDao personDao) {
    7.  
      this.personDao = personDao;
    8.  
      }
    9.  
      // 实现PersonService接口的方法
    10.  
      @Override
    11.  
      public void addPerson() {
    12.  
      personDao.add(); // 调用PersonDao中的add()方法
    13.  
      System.out.println("addPerson()执行了...");
    14.  
      }
    15.  
      }

    3.1 在 applicationContext.xml 中添加配置信息

    1.  
      <bean id="personService" class="com.mengma.ioc.PersonServiceImpl">
    2.  
      <!-- 将personDao实例注入personService实例中 -->
    3.  
      <constructor-arg ref="personDao"/>
    4.  
      </bean>

    3)接口注入 

  • 相关阅读:
    CF700C Break Up
    CF865C Gotta Go Fast
    CF1559D2 Mocha and Diana (Hard Version)
    CF1500C Matrix Sorting
    排列计数机
    CSP-S 2021 退役记
    【做题记录】[NOIP2011 提高组] 观光公交
    【做题记录】构造题
    乱搞
    二维树状数组
  • 原文地址:https://www.cnblogs.com/xhna/p/14216303.html
Copyright © 2011-2022 走看看