Spring 系列教程


本文介绍使用xml中配置Bean之间的依赖关系。

xml配置文件中,在bean的定义中可配置该bean的依赖项,通常使用的配置方式有2种:

  • 构造函数注入
  • Setter方法注入

构造函数注入

根据XML中的配置,Spring容器首先创建所依赖Bean实例,然后传递给类的构造函数。

示例:

public class App {

    private Service mainService;
private Service[] services; // 注入Service实例
public App(Service main){
this.mainService = main;
} // 注入Service实例数组
public App(Service[] services){
this.services = services;
}
}

在bean.xml中,定义App类依赖项:


<!-- App Bean定义 -->
<bean id="app" class="App"> <!-- 构造函数注入单个依赖项实例 -->
<constructor-arg ref="logger"/> <!-- 构造函数注入依赖项实例数组 -->
<!-- <constructor-arg>
<list>
<ref bean="database"/>
<ref bean="mail"/>
<ref bean="logger"/>
</list>
</constructor-arg> -->
</bean> <!-- Service bean (依赖项)定义 -->
<bean id="database" class="Database"/>
<bean id="logger" class="Logger"/>
<bean id="mail" class="Mail"/>

DatabaseLoggerMail都继承自基类Service

<constructor-arg>用于构造函数方式注入Bean,ref属性指明要注入的Bean(引用方式),属性值是所依赖bean的ID。

XML的bean定义中只能有1个<constructor-arg>,所以在上面的示例中要么注入单个服务实例,要么注入服务实例数组。

确保在XML文件中为所有依赖项配置bean,否则Spring容器无法注入这些依赖项。

Setter方法注入

根据XML中的配置,Spring容器调用类的Setter方法注入依赖项。

示例:

public class App {

    // ...

    public Service getMainService() {
return mainService;
} // 通过setter方法注入服务实例
public void setMainService(Service mainService) {
this.mainService = mainService;
} public Service[] getServices() {
return services;
} // 通过setter方法注入服务实例数组
public void setServices(Service[] services) {
this.services = services;
}
}

在bean.xml中,定义类的依赖项。Spring容器根据<property>配置,调用类的相应setter方法,设置属性,实现依赖项的注入。

<bean id="app" class="App">

 <!-- Setter 方法配置 -->
<property name="mainService" ref="logger"/>
<property name="services">
<list>
<ref bean="database"/>
<ref bean="mail"/>
<ref bean="logger"/>
</list>
</property> </bean>

Spring容器怎么知道调用哪个setter方法? Spring容器根据name调用setter方法:name对应“set”关键字后面的属性名,name="mainService"对应于setMainService

注入值的配置

前面介绍了使用<constructor-arg><property>注入依赖的Bean实例,另外还可以使用它们来注入值。

示例:

<bean id="app" class="App">

 <!-- 构造函数注入值 -->
<constructor-arg type="int" value="12345"/>
<constructor-arg type="java.lang.String" value="myApp"/> <!-- 也可通过构造函数的参数序号注入值 -->
<!-- <constructor-arg index="0" value="12345"/> -->
<!-- <constructor-arg index="1" value="myApp"/> --> <!-- Setter方法注入值 -->
<!-- <property name="id" value="1234"/> -->
<!-- <property name="name" value="myApp"/> --> </bean>

XML中value属性的值会赋给类中的属性,如果引用一个bean,则使用ref属性。

如果需要传递空字符串或null作为值,可以按如下设置:

<bean id="app" class="App">
<property name="name" value=""/>
</bean>
<bean id="app" class="App">
<property name="name"><null/></property>
</bean>

Bean XML 配置(3)- 依赖注入配置的更多相关文章

  1. Bean 注解(Annotation)配置(3)- 依赖注入配置

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  2. spring 配置bean的方法及依赖注入发方式

    Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).FactoryBean 这里依据全类名配置bean <bean id="helloWo ...

  3. Spring ——依赖注入配置一些知识点

    依赖注入 依赖注入的原理与实现 依赖注入(DI)和依赖查找(Dependency Lookup)共同组成 控制反转(IoC).从原理的角度来说,依赖注入和控制反转是没 有不同的,可以看作是从两个角度来 ...

  4. Spring系列.依赖注入配置

    依赖注入的配置 Spring的依赖注入分为基于构造函数的依赖注入和基于setter方法的依赖注入. 基于构造函数的依赖注入 <!-- 通过构造器参数索引方式依赖注入 --> <bea ...

  5. SSH-运行main函数,一直报空指针,调依赖注入配置的dao

    解决this.getHibernateTemplate()==null的问题 刚刚在整合SSH时碰到了这样一个问题: 当我用junit测试时不会报任何异常,数据也都能得到 但当我运行man函数,直接n ...

  6. Spring(五)之Bean定义继承和依赖注入

    一.Bean定义继承 bean定义可以包含许多配置信息,包括构造函数参数,属性值和特定于容器的信息,例如初始化方法,静态工厂方法名称等. 子bean定义从父定义继承配置数据.子定义可以根据需要覆盖某些 ...

  7. Spring学习(十八)Bean 的三种依赖注入方式介绍

    依赖注入:让调用类对某一接口实现类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖.接下来将详细的向大家介绍Spring容器支持的三种依赖注入的方式以及具体配置方法:•    属性注入方法• ...

  8. Spring源码解析(四)Bean的实例化和依赖注入

    我们虽然获得了Bean的描述信息BeanDefinition,但是什么时候才会真正的实例化这些Bean呢.其实一共有两个触发点,但是最后实际上调用的是同一个方法. 第一个:在AbstractAppli ...

  9. Spring配置及依赖注入

    入门 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-we ...

随机推荐

  1. 如何让浏览器的左上角显示自己的logo的小诀窍

    很简单,只需要在head头部加上以下代码 <link rel="icon" href="图片路径" type="image/x-icon&quo ...

  2. 《Redis深度历险:核心原理和应用实践》千帆竞发——分布式锁

  3. Day8 - C - Largest Rectangle in a Histogram HDU - 1506

    A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rec ...

  4. 【Luogu2496】【BZOJ3005】[SDOI2012]体育课

    把自己去年在luogu写的一个题解搬过来 原题解链接 1. 题目大意 给定一个长度为 \(n\) 的数列 \(a_1,a_2,a_3,...,a_n\) , 并给出 \(m\) 个操作,操作类型如下: ...

  5. 使用loadrunner监控apcahe资源

    一般要修改的内容在Httpd.conf文件中已经存在,如果不存在请自行添加相应内容. (1)修改Apache中Httpd.conf文件, (2)添加ExtendedStatus,设置ExtendedS ...

  6. mysql分区介绍

    http://www.cnblogs.com/chenmh/p/5644713.html 介绍 可以针对分区表的每个分区指定各自的存储路径,对于innodb存储引擎的表只能指定数据路径,因为数据和索引 ...

  7. HTML设置目标页面在新窗口打开

    在使用<a></a>标签进行超链接跳转时,目标页面默认在当前页面中打开. 如果希望当前页面中所有超链接跳转页面的时候,都在新窗口中打开,那么只需要在head标签中设置 base ...

  8. PCHMI工控组态开发视频教程

    PCHMI是一款适合所有PLC工程师快速上手工控组态开发的控件 下面是视频教程链接 PCHMI工控组态 02-按钮的使用 PCHMI工控组态 03-数据显示器使用 PCHMI工控组态 04-标签控件的 ...

  9. python编写banner获取的常用模块

    模块的概念:模块也叫库,每个模块中都内置了大量的功能和函数.类和变量.它就像是积木,可以根据需要进行调用组合.模块就是程序,每个模块就是一个后缀为.py的Python程序.Python的模块分为标准模 ...

  10. java 加法变乘法

    加法变乘法 我们都知道:1+2+3+ - + 49 = 1225 (1) 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+...+10*11+12+...+27*28 ...