Spring中依赖注入(DI)几种方式解读

 更新时间:2024年01月16日 09:45:12   作者:加油当当  
这篇文章主要介绍了Spring中依赖注入(DI)几种方式解读,构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖,需要的朋友可以参考下

Spring依赖注入(DI)

构造器注入

  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>

到此这篇关于Spring中依赖注入(DI)几种方式解读的文章就介绍到这了,更多相关Spring依赖注入(DI)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC ajax请求的处理方法介绍

    SpringMVC ajax请求的处理方法介绍

    Ajax即异步的 JavaScript和XML,是一种无需重新加载整个网页的情况下,能够更新部分模块的网页技术,下面这篇文章主要给大家介绍了关于SpringMVC Ajax请求的处理,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • java必学必会之equals方法

    java必学必会之equals方法

    java必学必会之equals方法,equals方法是 java.lang.Object 类的方法,想要了解更多关于equals方法的朋友,可以参考下文
    2015-12-12
  • Java实现图片上传至服务器功能(FTP协议)

    Java实现图片上传至服务器功能(FTP协议)

    这篇文章主要为大家详细介绍了Java实现图片上传至服务器功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Java获取客户端真实IP地址过程解析

    Java获取客户端真实IP地址过程解析

    这篇文章主要介绍了Java获取客户端真实IP地址过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java中的static和final关键字的使用详解

    Java中的static和final关键字的使用详解

    这篇文章主要介绍了Java中的static和final关键字的使用详解,  当方法名前有static,即为static方法,可以方便我们无需创建对象也可以调用此方法,静态方法比较拉,只可以访问 静态的 属性/变量/方法,无法访问非静态的这些属性/变量/方法,需要的朋友可以参考下
    2024-01-01
  • 深入理解Java 对象和类

    深入理解Java 对象和类

    下面小编就为大家带来一篇深入理解Java 对象和类。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • Java中Collections.sort()排序方法举例详解

    Java中Collections.sort()排序方法举例详解

    很多时候都需要对一些数据进行排序的操作,这篇文章主要给大家介绍了关于Java中Collections.sort()方法举例详解的相关资料,使用Collections.sort()可以使用其sort()方法来对List、Set等集合进行排序,需要的朋友可以参考下
    2024-02-02
  • Java 实现多线程的几种方式汇总

    Java 实现多线程的几种方式汇总

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。
    2016-03-03
  • PowerJob的OhMyClassLoader工作流程源码解读

    PowerJob的OhMyClassLoader工作流程源码解读

    这篇文章主要介绍了PowerJob的OhMyClassLoader工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • MyBatis控制台显示SQL语句的方法实现

    MyBatis控制台显示SQL语句的方法实现

    这篇文章主要介绍了MyBatis控制台显示SQL语句的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论