Spring 依赖注入(DI)几种方式:【重点】【重点】【重点】【重点】【面试】【面试问不问你也得会啊】

首先需要注意要分清依赖注入与装配的关系,依赖注入的本质就是装配,装配是依赖注入的具体;所以只有2大类DI!!而不是别的教程说的4种或5种;

构造器注入

  1. 构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。【一般不用】
  2. 在构造调用者实例的同时,在构造方法中给属性赋值,完成被调用者的实例化。即,使用构造器设置依赖关系
  3. 优点:对象初始化完成后便可获得可使用的对象
  4. 缺点:当需要注入的对象很多时,构造器参数列表将会很长;不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,麻烦
  5. Spring容器会将每一个正在创建的 Bean 标识符放在一个"当前创建 Bean 池"中,Bean 标识符在创建过程中将一直保持在这个池中,因此如果在创建 Bean 过程中发现自己已经在"当前创建 Bean 池"里时将抛出BeanCurrentlyInCreationException异常表示循环依赖而对于创建完毕的 Bean 将从"当前创建 Bean 池"中清除掉
  6. <constructor-arg> 标签:一个<constructor-arg>表示构造方法一个参数
  7. <constructor-arg> 标签属性
    • name:表示构造方法的形参名;
    • index:表示构造方法的参数的位置,参数从左往右位置是 0,1,2 的顺序;
    • value:构造方法的形参类型是简单类型的,使用value;
    • ref:构造方法的形参类型是引用类型的,使用ref;
  8. 代码示例:
    public Student(String myname,int myage,School myXueXiao){
    
    System.out.print1n( "student的有参数构造方法");
    
    this.name = myname;
    
    this.age = myage;
    
    this.school= myXueXiao;
    
    }

<!--使用name属性实现构造注入-->

<bean id="myStudent" class="com.bit.ba03.Student" >

<constructor-arg name="myage" value="20" />

<constructor-arg name="mySchool" ref="myXueXiao" />

<constructor-arg name="myname" value="周良"/>

</bean>

<!--使用index属性-->

<bean id="myStudent2" class="com.bit.ba03.Student">

<constructor-arg index="1" value="22" />

<constructor-arg index="0" value="李四" />

<constructor-arg index="2" ref="myXueXiao" />

</bean>

<!--省略index,顺序不能乱写了-->

<bean id="myStudent3" class="com.bit.ba03.Student">

<constructor-arg value="张强强" />

<constructor-arg value="22" />

<constructor-arg ref="myXueXiao" />

</bean>

setter方法注入

  1. Setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入
  2. IOC Service Provider 通过调用成员变量提供的setter函数将被依赖对象注入给依赖类
  3. 优点:灵活。可以选择性地注入需要的对象
  4. 缺点:依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用

简单类型的set注入:

  • 简单类型: spring中规定java的基本数据类型和String都是简单类型;
  • set属性会调用属性中的set方法进行赋值,属性是been中指定类中的属性所以要求类中必须有set方法
  • 先执行构造方法创建对象,然后执行set方法进行赋值;
  • 代码:
public class Id {

private int id;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

}
<bean id="xx" class="yyy.Id">

<property name="属性名字" value="此属性的值"/>

一个property只能给一个属性赋值

<property....>

</bean>

引用类型set注入:

  • 当指定 bean 的某属性值为另一 bean 的实例时,通过 ref 指定它们间的引用关系。ref 的值必须为某 bean 的 id 值;
  • set属性会调用属性中的set方法进行赋值,属性是been中指定类中的属性所以要求类中必须有set方法
  • 先执行构造方法创建对象,然后执行set方法进行赋值;

<bean id="xxx" class="yyy">

<property name="属性名称" ref="bean的id(对象的名称)" />

</bean>

  • 代码:
public class student{

private string name;private int age;

private school school;

// setter

// toString()

}
<bean id="myStudent" class="com.bit.ba02.Student">

<!--引用类型的属性赋值–->

<property name="school" ref="mySchool" />〈!-- setSchool(mySchool) -->

</bean>

参考:

动力节点等教程;

依赖注入与自动装配_谦虚使人发胖的博客-CSDN博客_依赖注入和自动装配

猜你喜欢

转载自blog.csdn.net/jiayoudangdang/article/details/124175201