之前我们提到了Bean实例化的三种方式:构造器方式、静态工厂方式、普通工厂方式。那么对于Bean中的属性,又是如何进行注入的(依赖注入),这个篇章就来提一提。

1、先提提什么是“依赖注入”

依赖注入,就是由外部容器动态地将依赖对象注入到另一个对象的组件中,Spring采用这种方式为Bean的属性进行赋值。

通俗地说,Spring容器不仅可以初始化对象,也可以为对象当中的成员变量进行赋值,初始化成员变量对象以及赋值的过程,不需手动编码,而是由Spring容器去做。这种依赖容器初始化对象,并赋值给Bean全局变量的方式,叫做依赖注入。

传统方式:
Boy boy = new Boy();
Dog dog = new Dog();
boy.setDog(dog);
3
 
1
Boy boy = new Boy(); 
2
Dog dog = new Dog();
3
boy.setDog(dog);

依赖注入方式:
<bean id="boy" class="dulk.learn.spring.Boy">
<property name="dog" ref="dog"></property>
</bean> <bean id="dog" class="dulk.learn.spring.Dog"></bean>
5
 
1
<bean id="boy" class="dulk.learn.spring.Boy">
2
    <property name="dog" ref="dog"></property>
3
</bean>
4

5
<bean id="dog" class="dulk.learn.spring.Dog"></bean>

2、Bean属性的注入方式

Bean属性的注入方式有两种:
  • 手动注入
  • 自动匹配

手动注入可以通过注解或者配置文件的方式,采用对象的构造方法或者setter进行注入;而自动匹配则是容器通过某种规则进行自动匹配,比如byName、byType、constructOr。手动注入相比来说代码要多一些,但是并不会产生不确定性,所以还是建议更多地使用手动注入的方式。

2.1 手动注入

2.1.1 setter

Spring容器调用Bean组件中属性对应的setter方法完成属性的赋值,可以分为:
  • 基本类型注入
  • Spring组件类型注入
  • 集合类型注入

2.1.1.1 基本注入类型

这里的基本注入类型,泛指当前Bean组件的属性为基本数据类型(如int)、基本数据类型的封装类(如Integer)、String、StringBuffer等,容器可以读取配置文件对当前属性进行赋值。

<bean id="dog" class="dulk.learn.spring.Dog">
<property name="name" value="旺财"></property>
</bean>
3
 
1
<bean id="dog" class="dulk.learn.spring.Dog">
2
    <property name="name" value="旺财"></property>
3
</bean>
如上property标签即用来注入Bean的属性,name属性对应setter的属性名称,value则对应值。即这里是指将生成的Dog对象,注入其属性name为“旺财”。

2.1.1.2 Spring组件类型注入

这种方式正如其名,注入的值也是Spring容器管理的Bean对象:
<bean id="boy" class="dulk.learn.spring.Boy">
<property name="dog" ref="dog"></property>
</bean> <bean id="dog" class="dulk.learn.spring.Dog">
<property name="name" value="旺财"></property>
</bean>
7
 
1
<bean id="boy" class="dulk.learn.spring.Boy">
2
    <property name="dog" ref="dog"></property>
3
</bean>
4

5
<bean id="dog" class="dulk.learn.spring.Dog">
6
    <property name="name" value="旺财"></property>
7
</bean>

2.1.1.3 集合类型注入

集合类型注入泛指,当前Bean组件的属性为List、Set、Map、数组、Properties等:
<bean id="boy" class="dulk.learn.spring.Boy">
<property name="dog" ref="dog"></property>
<property name="bookList">
<list>
<value type="java.lang.String">《水浒传》</value>
<ref bean="beanName"/>
<null></null>
</list>
</property>
</bean> <bean id="dog" class="dulk.learn.spring.Dog">
<property name="name" value="旺财"></property>
</bean>
x
 
1
<bean id="boy" class="dulk.learn.spring.Boy">
2
    <property name="dog" ref="dog"></property>
3
    <property name="bookList">
4
        <list>
5
            <value type="java.lang.String">《水浒传》</value>
6
            <ref bean="beanName"/>
7
            <null></null>
8
        </list>
9
    </property>
10
</bean>
11

12
<bean id="dog" class="dulk.learn.spring.Dog">
13
    <property name="name" value="旺财"></property>
14
</bean>

List中对象的顺序,按照从上到下的赋值顺序,List当中的数据类型可以为基本类型、Spring组件类型、集合类型等。

当然,如上例中是对List举例,对于Set而言也几乎是一样的,无非是将上例中的<list>标签更换为<set>,此处便不再举例了。而对于Map而言,除了将上例中<list>标签替换为<map>,因为其为键值对形式的存储,形式稍微有点变化:
<bean id="boy" class="dulk.learn.spring.Boy">
<property name="dog" ref="dog"></property>
<property name="scoreMap">
<map>
<entry key="数学" value="99"></entry>
<entry key="语文" value="75"></entry>
<entry key-ref="beanId" value-ref=""></entry>
</map>
</property>
</bean>
10
 
1
<bean id="boy" class="dulk.learn.spring.Boy">
2
    <property name="dog" ref="dog"></property>
3
    <property name="scoreMap">
4
        <map>
5
            <entry key="数学" value="99"></entry>
6
            <entry key="语文" value="75"></entry>
7
            <entry key-ref="beanId" value-ref=""></entry>
8
        </map>
9
    </property>
10
</bean>

最后简单提下Properties注入方式:
<property name="properties">
<props>
<prop key="username">zhangsan</prop>
<prop key="password">123456</prop>
</props>
</property>
6
 
1
<property name="properties">
2
    <props>
3
        <prop key="username">zhangsan</prop>
4
        <prop key="password">123456</prop>
5
    </props>
6
</property>

2.1.2 构造器

构造器方法注入,顾名思义,是Spring在初始化Bean组件时,调用含参数的构造函数对变量进行赋值,参数类型同setter方式一样,也可以为基本类型、Bean组件类型或者集合类型。

实际上这种属性注入方式,在关于Bean实例化的章节中已经提到了,用到了<constructor-arg>标签,我们再看下当时的例子:
<bean id="coder" class="dulk.learn.spring.Coder">
<constructor-arg index="0" value="Dulk"></constructor-arg>
<constructor-arg index="1" value="27"></constructor-arg>
</bean>
4
 
1
<bean id="coder" class="dulk.learn.spring.Coder">
2
    <constructor-arg index="0" value="Dulk"></constructor-arg>
3
    <constructor-arg index="1" value="27"></constructor-arg>
4
</bean>

如果依赖的是Bean组件,这里的value换成ref属性就行了。其他和setter方式类型,这里也就不再繁琐地进行展开描述了。


2.2 自动注入

对于自动注入(自动装配),这里暂不推荐使用,所以大概提及一下,也很简单,所以不会详细进行展开。

自动注入的示例格式如下:
<bean id="beanId" class="className" autowire="${type}"></bean>
 
1
<bean id="beanId" class="className" autowire="${type}"></bean>

这里的自动注入autowire属性有如下取值:
  • byType
  • byName
  • constructor

byType(默认值):按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的Bean,如果发现多个,那么将会抛出异常,如果没有找到,那么属性值为null

byName:按名称装配,可以根据属性的名称,在容器中寻找跟该属性名相同的Bean(Bean的id或name),如果没有找到,即属性值为null

constructor:与byType方式类似,不同至于在于它应用于构造函数参数。如果在容器中没有找到与构造函数参数类型一致的Bean,将会抛出异常

以上,都是在容器中寻找Bean,请注意。


[06] Bean属性的注入的更多相关文章

  1. spring实战一:装配bean之注入Bean属性

    内容参考自spring in action一书. 创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入的本质. 1. 创建spring配置 spring是一个基于容器的框架.如果没有配置spri ...

  2. 依赖注入Bean属性

    一.Bean属性依赖注入 对于类成员变量,注入方式有三种 •构造函数注入 •属性setter方法注入 •接口注入 Spring支持前两种 1.构造函数 属性注入 使用构造方法注入,在Spring配置文 ...

  3. Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入

    本节主要内容:       1.实例化Spring容器示例    2.利用Spring容器创建JavaBean对象    3.如何控制Bean实例化    4.利用Spring实现bean属性sett ...

  4. Spring入门(4)-注入Bean属性

    Spring入门(4)-注入Bean属性 本文介绍如何注入Bean属性,包括简单属性.引用.内部Bean.注入集合等. 0. 目录 注入简单值 注入引用 注入内部Bean 装配集合 装配空值 使用命名 ...

  5. Spring学习笔记--注入Bean属性

    这里通过一个MoonlightPoet类来演示了注入Bean属性property的效果. package com.moonlit.myspring; import java.util.List; im ...

  6. Spring学习(五)-----注入bean属性的三种方式( 1: 正常的方式 2: 快捷方式 3: “p” 模式)

    在Spring中,有三种方式注入值到 bean 属性. 正常的方式 快捷方式 “p” 模式 看到一个简单的Java类,它包含两个属性 - name 和 type.稍后将使用Spring注入值到这个 b ...

  7. Spring注入日期到bean属性-CustomDateEditor

    这一个Spring例子向您展示如何为bean属性注入一个“日期”. package com.yiibai.common; import java.util.Date; public class Cus ...

  8. 如何注入值到Spring bean属性

    在Spring中,有三种方式注入值到 bean 属性. 正常的方式 快捷方式 “p” 模式 看到一个简单的Java类,它包含两个属性 - name 和 type.稍后将使用Spring注入值到这个 b ...

  9. spring学习笔记之---bean属性注入

    bean属性注入 (一)构造方法的属性注入 1.Student.java package entity; public class Student { private String name; pri ...

随机推荐

  1. Python 练习:三级菜单选择城市(二)

    优化了上一个三级菜单选择城:http://www.cnblogs.com/klvchen/p/8646466.html info = { 'GuangDong':{ 'GuangZhou': ['Ti ...

  2. 【20190123】JavaScript-轮播图特效中出现的问题

    使用纯html和JavaScript实现焦点轮播图特效,本来之前用setInterval()函数写的一个简单的循环轮播图,但是出现了两个问题:   1. 当网页被切换时,也就是网页失去焦点时,计时器函 ...

  3. 【面试】Python面试题库

    https://blog.csdn.net/ChenVast/article/details/81451460 第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Py ...

  4. ArcGIS for Server 的修改IP问题

      ArcGIS for Server 的修改IP问题   1. [arcgisserver@centos6 ~]$ vi /home/arcgisserver/serverconfig/config ...

  5. 在Apex中使用sObject

    sObject对象的定义 Salesforce中的标准对象或自定义对象在Apex中使用时被称作"sObject".sObject对象的一个实例相当于Salesforce中的一条记录 ...

  6. Windows中几个内存相当的指标

    以下几个内存大小相当: IS:虚拟内存任务管理器:提交内存进程对象上的:PrivateMemorySize64,性能计数器:Process\Private Bytes

  7. Clumsy 利用无线网卡结合Clumsy软件模拟弱网络测试

    利用无线网卡结合Clumsy软件模拟弱网络测试 by:授客 QQ:1033553122 实践环境 Clumsy 0.2 下载地址:http://jagt.github.io/clumsy/downlo ...

  8. Java:【面向对象:抽象类,接口】

    本文内容: 抽象类 接口 抽象类与接口的异同 首发日期:2018-03-24 抽象类: 虽然已经有了父类,但有时候父类也是无法直接描述某些共有属性的,比如哺乳类和人类都会叫,而一般来说哺乳类这个父类并 ...

  9. solr-query

    解释: 1.query:获取全部数据的SQL 2.deltaImportQuery:获取增量数据时使用的SQL 3.deltaQuery:获取pk的SQL 4.parentDeltaQuery:获取父 ...

  10. Tensorflow实现稀疏自动编码(SAE)

    1.概述 人在获取图像时,并不是像计算机逐个像素去读,一般是扫一眼物体,大致能得到需要的信息,如形状,颜色,特征.怎么让机器也有这项能力呢,稀疏编码来了. 定义: 稀疏自编码器(Sparse Auto ...