Spring依赖注入的两种方式(根据实例详解)

1,Set注入    2,构造注入

Set方法注入:

原理:通过类的setter方法完成依赖关系的设置

name属性的取值依setter方法名而定,要求这个类里面这个对应的属性必须有setter方法。

Set方法注入时spring中配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

  <bean id="car" class="org.spring01.Car">
    <constructor-arg value="奔驰"></constructor-arg>
    <constructor-arg type="java.lang.String">
      <value>土豪金</value>
    </constructor-arg>
    <constructor-arg value="高级轿车"></constructor-arg>
  </bean> 

  <bean id="person" class="org.spring01.Person">
    <property name="name" value="张三"></property>
    <property name="age" value="11"></property>
    <property name="car" ref="car"></property>
  </bean>
</beans>

定义Car类:

package org.spring01; 

public class Car {
  private String name;//车名
  private String color;//颜色
  private String clas;//等级
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getColor() {
    return color;
  }
  public void setColor(String color) {
    this.color = color;
  }
  public String getClas() {
    return clas;
  }
  public void setClas(String clas) {
    this.clas = clas;
  }
  public Car(String name, String color, String clas) {
    super();
    this.name = name;
    this.color = color;
    this.clas = clas;
  } 

  public Car() {
    super();
    // TODO Auto-generated constructor stub
  }
  @Override
  public String toString() {
    return "Car [name=" + name + ", color=" + color + ", clas=" + clas
        + "]";
  } 

}

定义Person类:

package org.spring01; 

public class Person {
  private String name;//名字
  private int age;//年龄
  private Car car;//他的车
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public Car getCar() {
    return car;
  }
  public void setCar(Car car) {
    this.car = car;
  }
  public Person(String name, int age, Car car) {
    super();
    this.name = name;
    this.age = age;
    this.car = car;
  }
  public Person() {
    super();
    // TODO Auto-generated constructor stub
  }
  @Override
  public String toString() {
    return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
  } 

}

测试类:

package org.spring01; 

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class SpringTest{
    @Test
    public void toGetPerson(){
      ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
      Person person = (Person) context.getBean("person");
      System.out.println(person);
    }
    @Test
    public void toGetCar(){
      ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
      Car car = (Car) context.getBean("car");
      System.out.println(car);
    }
} 

使用单元测试(JUnit)测试toGetPerson()方法,结果为:

Person [name=张三, age=11, car=Car [name=奔驰, color=土豪金, clas=高级轿车]]

构造方法注入:

原理:通过构造函数完成依赖关系的设定

构造注入指的是在接受注入的类中,定义一个构造方法,并在构造方法的参数中定义需要注入的元素,其中,index表示构造方法中的参数索引(第一个参数索引为0)。

构造方法注入时spring中配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

  <bean id="car" class="org.spring02.Car">
    <constructor-arg value="大众"></constructor-arg>
    <constructor-arg type="java.lang.String">
      <value>白色</value>
    </constructor-arg>
    <constructor-arg value="中级轿车"></constructor-arg>
  </bean> 

  <bean id="person" class="org.spring02.Person">
    <constructor-arg index="0" value="李四"></constructor-arg>
    <constructor-arg index="1" value="23"></constructor-arg>
    <constructor-arg index="2" ref="car"></constructor-arg>
  </bean>
</beans>

定义Car类:

package org.spring02; 

public class Car {
  private String name;//车名
  private String color;//颜色
  private String clas;//等级 

  public Car(String name, String color, String clas) {
    super();
    this.name = name;
    this.color = color;
    this.clas = clas;
  } 

  public Car() {
    super();
    // TODO Auto-generated constructor stub
  }
  @Override
  public String toString() {
    return "Car [name=" + name + ", color=" + color + ", clas=" + clas
        + "]";
  } 

}

定义Person类:

package org.spring02; 

public class Person {
  private String name;//名字
  private int age;//年龄
  private Car car;//他的车 

  public Person(String name, int age, Car car) {
    super();
    this.name = name;
    this.age = age;
    this.car = car;
  }
  public Person() {
    super();
    // TODO Auto-generated constructor stub
  }
  @Override
  public String toString() {
    return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
  } 

}

测试类:

package org.spring02; 

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class SpringTest{
    @Test
    public void toGetPerson(){
      ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext01.xml");
      Person person = (Person) context.getBean("person");
      System.out.println(person);
    }
    @Test
    public void toGetCar(){
      ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext01.xml");
      Car car = (Car) context.getBean("car");
      System.out.println(car);
    }
}

使用单元测试(JUnit)测试toGetPerson()方法,结果为:

Person [name=李四, age=23, car=Car [name=大众, color=白色, clas=中级轿车]]

上面的例子都采用了单元测试的方法检测运行结果,需要导库: JUnit

Demo的大体结构:

我们可以看到,set方法和构造方法都可以设值成功, 实际开发中最常用到的是set方法设值。但这两种依赖注入的方式并没有绝对的好坏,只是使用的场合不同。

使用构造注入可以在构建对象的同时完成依赖关系到的建立,所以如果要建立的对象的关系很多,使用构造注入会在构造方法上留下很多参数,可读性极差,所以当对象的关系比较多的时候采用set方法注入。

使用set方法注入是通过类的setter方法完成依赖关系的设置的,所以不能保证相关的数据在执行时不被更改设定。所以如果想使一些数据变为只读或者私有,就要采用构造注入了。

建议采用以set注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他的依赖关系的注入,则考虑采用set注入。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring 依赖注入的几种方式详解

    IoC 简介 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中. 依赖注入的另一种说法是"控制反转".通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员. 而控制反转是指new实例工作不由我们程序员来做而是交给Spring容器来做.

  • 详解Java Spring各种依赖注入注解的区别

    注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Component. Autowired是自动注入,自动从spring的上下文找到合适的bean来注入 Resource用来指定名称注入 Qualifier和Autowired配合使用,指定bean的名称 Service,Controller,Repository分别标记类是Service层类,Contro

  • Spring quartz Job依赖注入使用详解

    Spring quartz Job依赖注入使用详解 一.问题描述: 使用Spring整合quartz实现动态任务时,想在job定时任务中使用某个service时,直接通过加注解@Component.@Autowired是不能注入的,获取的对象为Null.如下面的代码: @Component @PersistJobDataAfterExecution @DisallowConcurrentExecution public class TicketSalePriceLessThanLowestPri

  • 深入解析Java的Spring框架中bean的依赖注入

    每一个基于java的应用程序都有一个共同工作来展示给用户看到的内容作为工作的应用几个对象.当编写一个复杂的Java应用程序,应用程序类应该尽可能独立其他Java类来增加重复使用这些类,并独立于其他类别的测试它们,而这样做单元测试的可能性.依赖注入(或有时称为布线)有助于粘合这些类在一起,同时保持他们的独立. 考虑有其中有一个文本编辑器组件的应用程序,要提供拼写检查.标准的代码将看起来像这样: public class TextEditor { private SpellChecker spell

  • 因Spring AOP导致@Autowired依赖注入失败的解决方法

    发现问题: 之前用springAOP做了个操作日志记录,这次在往其他类上使用的时候,service一直注入失败,找了网上好多内容,发现大家都有类似的情况出现,但是又和自己的情况不太符合.后来总结自己的情况发现:方法为private修饰的,在AOP适配的时候会导致service注入失败,并且同一个service在其他的public方法中就没有这种情况,十分诡异. 解决过程: 结合查阅的资料进行了分析:在org.springframework.aop.support.AopUtils中: publi

  • spring四种依赖注入方式的详细介绍

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种

  • JavaWeb Spring依赖注入深入学习

    一.依赖注入(DI) 依赖注入听起来很高深的样子,其实白话就是:给属性赋值.一共有两种方法,第一是以构造器参数的形式,另外一种就是以setting方法的形式. 1 构造器注入 1 使用构造器注入 使用xml的注入方式 A. 通过参数的顺序 <constructor-arg index="0"><value>张三</value></constructor-arg> <constructor-arg index="1"

  • 实例讲解Java的Spring框架中的控制反转和依赖注入

    近来总是接触到 IoC(Inversion of Control,控制反转).DI(Dependency Injection,依赖注入)等编程原则或者模式,而这些是著名 Java 框架 Spring.Struts 等的核心所在.针对此查了 Wikipedia 中各个条目,并从图书馆借来相关书籍,阅读后有些理解,现结合书中的讲解以及自己的加工整理如下: eg1 问题描述: 开发一个能够按照不同要求生成Excel或 PDF 格式的报表的系统,例如日报表.月报表等等.   解决方案: 根据"面向接口编

  • 详解SpringBoot中实现依赖注入功能

    今天给大家介绍一下SpringBoot中是如何实现依赖注入的功能. 在以往spring使用中,依赖注入一般都是通过在Spring的配置文件中添加bean方法实现的,相对于这个方式SpringBoot的实现方式就显得非常便捷了.SpringBoot的实现方式基本都是通过注解实现的. 下面来看一下具体案例,这里我编写了三个测试类用于测试依赖注入到底是否可以正确实现. TestBiz接口: package example.biz; public interface TestBiz { public S

  • 详析Spring中依赖注入的三种方式

    前言 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. 在Sprin

随机推荐