本章主要讲解一下Spring中依赖注入方式,接上一章依赖注入原理和方式:
https://blog.csdn.net/qq_34598667/article/details/83315669

依赖注入常用的两种方式以及注入的内容(装配数据)

Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入和接口注入。
本章重点讲解基本的两种方式构造器和setter,注解后面会单独一章讲解


案例准备

创建ApplicationContext.xml作为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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd" ><!-- bean ... -->
</beans>

在新建一个包,com.oak.entity,新建实体类Personh和Man如下:

public class Person {private String name;private Integer age;//... 构造方法,getter,setter和toString方法略
}
public class Man {private Person person;//... 构造方法,getter,setter和toString方法略
}

新建一个com.oak.test,新建一个DITest类


构造器注入

容器调用带有一组参数的类构造方法完成依赖注入,使用的是〈bean〉标签中的〈constructor-arg〉元素
在xml中添加bean,使用构造器注入属性值,使用value属性进行参数值的注入

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd" ><!-- 构造器注入 --><bean id="person" class="com.oak.entity.Person"><constructor-arg value="二狗"/><constructor-arg value="18"/></bean>
</beans>

在DUTest类中添加测试方法test01并测试:

 @Testpublic void test01(){ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person=ctx.getBean("person",Person.class);System.out.println(person);}

查看控制台输出:

Person [name=二狗, age=18]

1)多个参数时,把参数传递给构造函数可能会存在歧义

可以使用 index 属性来显式的指定构造函数参数的索引,索引从0开始
修改< bean >定义如下:

 <bean id="person" class="com.oak.entity.Person"><constructor-arg index="0" value="二狗"/><constructor-arg index="1" value="18"/></bean>

2)使用type属性指定参数的类型

注意:基本类型有包装类型需要进行区分
修改< bean >定义如下:

 <bean id="person" class="com.oak.entity.Person"><constructor-arg index="0" type="java.lang.String" value="二狗"/><constructor-arg index="1" type="java.lang.Integer" value="18"/></bean>

3)需要给参数指定一个引用(指向其他bean),使用ref属性

修改xml。添加一个bean定义

 <bean id="man" class="com.oak.entity.Man"><constructor-arg ref="person"/></bean>

修改test01并测试:

 @Testpublic void test01(){ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person=ctx.getBean("person",Person.class);System.out.println(person);Man man=ctx.getBean("man",Man.class);System.out.println(man);}

控制台输出结果:

Person [name=二狗, age=18]
Man [person=Person [name=二狗, age=18]]

setter方法注入

当容器调用一个无参的构造函数或一个无参的静态工厂方法来初始化bean,通过容器在bean 上调用setter设值函数 ,使用的是〈bean〉标签中的〈property〉元素
property的name属性指定类的属性名,需要一致,其他与构造器相同
在xml中添加一个新的bean

 <!-- setter方法注入 --><bean id="personSet" class="com.oak.entity.Person"><property name="age" value="18"/><property name="name" value="二蛋"/></bean>

在测试类中新加一个test02方法

 @Testpublic void test02(){ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person=ctx.getBean("personSet",Person.class);System.out.println(person);}

测试并查看控制台:

Person [name=二蛋, age=18]

注入的内容(装配数据)

1)参数值注入

上面已经讲过可以通过value进行参数值注入,使用ref进行bean对象的注入

2)注入集合

< list >:注入一列值,允许重复
< set >:注入一列值,不允许重复
< map >:注入键(名)值对的集合,名称和值可以是任何类型
< props >:注入键(名)值对的集合,名称和值可以是任何类
例:在com.oak.entity包中新建JavaCollection类如下:

public class JavaCollection {private List list;private Map map;private Properties prop;//构造方法,setter,getter和toString方法略}

在Spring配置中定义bean,修改xml,添加bean定义

         <bean id="coll" class="com.oak.entity.JavaCollection"><property name="list"><!-- 注入集合 值可重复 set就不举例了--><list><value>list1</value><value>list1</value></list></property><property name="map"><!-- 注入map --><map><entry key="二蛋"><value>18</value></entry></map></property><property name="prop"><!-- 注入properties --><props><prop key="二黑">男</prop></props></property></bean>

在测试类中新加测试方法test03并测试:

 @Testpublic void test03(){ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); JavaCollection collection=ctx.getBean("coll",JavaCollection.class);System.out.println(collection);}

查看控制太输出:

JavaCollection [list=[list1, list1], map={二蛋=18}, prop={二黑=男}]

注入Spring表达式

Sprng引入一种跟EL表达式类型语法的Spring表达式,可以读取一个bean对象或者集合中的内容:
#{bean.属性}
在Spring配置中定义bean,修改xml,添加bean定义

 <!-- setter方法注入 --><bean id="personSet1" class="com.oak.entity.Person"><property name="age" value="#{personSet.age}"/><property name="name" value="#{personSet.name}"/></bean>

在测试类中添加test04并测试

 @Testpublic void test04(){ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person=ctx.getBean("personSet",Person.class);System.out.println(person);Person person1=ctx.getBean("personSet1",Person.class);System.out.println(person1);}

查看控制台结果

Person [name=二蛋, age=18]
Person [name=二蛋, age=18]

注入空字符串或者null

""和< null />
就不做案例了


下一章:无注解的自动装配以及方式
https://blog.csdn.net/qq_34598667/article/details/83317377

依赖注入的两种常用方式(构造器和Setter)与注入内容(装配数据)——Spring IOC/DI(三)相关推荐

  1. 【IOC 控制反转】IOC 简介 ( 依赖注入的两种实现方式 | 编译期注入 | 运行期注入 )

    文章目录 一.IOC 简介 二.依赖注入的两种实现方式 一.IOC 简介 IOC 是 Inversion Of Control 的缩写 , 控制反转 ; 其最主要的作用是 降低代码的耦合度 , 最常见 ...

  2. Silve37.Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)

    在本节中将讲述Silverlight和ASP.NET页面的相互传参的两种常用方式:Cookie和QueryString.首先我们新建一个名 为SLConnectASP.NET的Silverlight应 ...

  3. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

  4. html中img显示图片的两种常用方式

    html中img显示图片的两种常用方式 显示图片,尤其是二维码的时候,大都是自动生成的,所以就需要能够从后台返回字符串,前台浏览器进行解析.好了,下面是这两种方式. 1. <img src=&q ...

  5. asp.net html silverlight 传参数,Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)...

    Silverlight实用窍门系列:37  程兴亮,网名煦风满裳 在本节中将讲述Silverlight和ASP.NET页面的相互传参的两种常用方式:Cookie和QueryString.首先我们新建一 ...

  6. python定义字符串变量有两种常用方式_Python 1基础语法二(标识符、关键字、变量和字符串)...

    一.标识符 标识符就是程序员自己命名的变量名.名字需要有见名知义的效果,不要随意起名 :比如 a=1 a是个变量,a这个变量名属于标识符 1 company = '小米 2 employeeNum = ...

  7. 依赖注入的两种常用的注入方式

    在Spring框架中,主要有两种依赖注入方式:基于构造函数.基于setter方法 1.基于构造函数 基于构造函数的DI(依赖注入)是通过调用具有多个参数的的构造函数的额容器来完成的,每个参数表示依赖关 ...

  8. vue 前端png转pdf_Vue前端HTML保存为PDF的两种常用方式 「干货分享」

    Vue前端HTML保存为PDF常用方式有两种.使用html2Canvas和JsPDF库,转化为图片后保存PDF. 调用浏览器window.print(),然后手动保存为PDF. 第一种 优点没有预览点 ...

  9. SQL2005利用ROW_NUMER实现分页的两种常用方式

    代码如下: declare @PageNumber int declare @PageSize int set @PageNumber=2 set @PageSize=20 --利用between s ...

  10. Perl读取文件的两种常用方式

    整体读入,逐行处理 open(FILE,"<","/home/chenmi/.bashrc")||die"cannot open the fil ...

最新文章

  1. Cloudera Manager 常见异常
  2. sqlplus command
  3. 开通了一个gmail邮箱
  4. pythonpandas设置索引_python – pandas:使用(row,col)索引设置值
  5. 【Boost】boost库中thread多线程详解8——call_once仅运行一次
  6. jzoj3847-都市环游【矩阵乘法】
  7. 如何玩转sortablejs-vuedraggable实现表单嵌套拖拽功能
  8. 怎样避免MYSQLD被OOM-KILLER杀死?
  9. MySql学习10-----存储过程和函数
  10. 基础 - 常见字符的ASCII码
  11. RM3100 stm32 hal库 spi 磁力计数据
  12. 关于自抗扰控制的稳定性分析
  13. 修改注册表 打造个性化右键菜单
  14. 跟着“Science”做张24h 南丁格尔玫瑰图吧
  15. pythonrq模块_Python RQ 任务队列中的队列 ( Queue )
  16. 提升自己的最好方式是什么呢?
  17. 浅谈农批市场的信息化:发展现状、信息化动因和契入方向
  18. Qt开发串口通信以及坐标显示程序并移植
  19. 每天学点clickhouse
  20. 能被2,3,4,5,6,7,8,9...等数整除的数特征

热门文章

  1. ValueError: operands could not be broadcast together with shapes (3000,20) (20,20)
  2. 最新回归算法理解、实现及应用(1)线性回归
  3. 数位DP算法概述及习题
  4. 【Codeforces Round #291 (Div. 2) C】Watto and Mechanism【Trie树、Hash】
  5. mysql根据id主键查询是找到了就不再遍历后面的数据了吗_MySQL索引相关
  6. 计算机主机光驱弹不出来怎么办,win7系统电脑按下光驱按钮托盘就是弹不出来怎么办...
  7. ppt生成eps文件_eps是什么格式怎么打开?全面解析图片的eps是什么格式
  8. c++输入回车结束循环,C++ cin如何输入回车停止
  9. CONVERT TEXT(转换为可排序格式)
  10. 2.mysql高级查询