Bean XML 配置(3)- 依赖注入配置
Spring 系列教程
- Spring 框架介绍
- Spring 框架模块
- Spring开发环境搭建(Eclipse)
- 创建一个简单的Spring应用
- Spring 控制反转容器(Inversion of Control – IOC)
- 理解依赖注入(DI – Dependency Injection)
- Bean XML 配置(1)- 通过XML配置加载Bean
- Bean XML 配置(2)- Bean作用域与生命周期回调方法配置
- Bean XML 配置(3)- 依赖注入配置
- Bean XML 配置(4)- 自动装配
- Bean 注解(Annotation)配置(1)- 通过注解加载Bean
- Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置
- Bean 注解(Annotation)配置(3)- 依赖注入配置
- Bean Java配置
- Spring 面向切面编程(AOP)
- Spring 事件(1)- 内置事件
- Spring 事件(2)- 自定义事件
本文介绍使用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"/>
Database
、Logger
、Mail
都继承自基类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)- 依赖注入配置的更多相关文章
- Bean 注解(Annotation)配置(3)- 依赖注入配置
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- spring 配置bean的方法及依赖注入发方式
Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).FactoryBean 这里依据全类名配置bean <bean id="helloWo ...
- Spring ——依赖注入配置一些知识点
依赖注入 依赖注入的原理与实现 依赖注入(DI)和依赖查找(Dependency Lookup)共同组成 控制反转(IoC).从原理的角度来说,依赖注入和控制反转是没 有不同的,可以看作是从两个角度来 ...
- Spring系列.依赖注入配置
依赖注入的配置 Spring的依赖注入分为基于构造函数的依赖注入和基于setter方法的依赖注入. 基于构造函数的依赖注入 <!-- 通过构造器参数索引方式依赖注入 --> <bea ...
- SSH-运行main函数,一直报空指针,调依赖注入配置的dao
解决this.getHibernateTemplate()==null的问题 刚刚在整合SSH时碰到了这样一个问题: 当我用junit测试时不会报任何异常,数据也都能得到 但当我运行man函数,直接n ...
- Spring(五)之Bean定义继承和依赖注入
一.Bean定义继承 bean定义可以包含许多配置信息,包括构造函数参数,属性值和特定于容器的信息,例如初始化方法,静态工厂方法名称等. 子bean定义从父定义继承配置数据.子定义可以根据需要覆盖某些 ...
- Spring学习(十八)Bean 的三种依赖注入方式介绍
依赖注入:让调用类对某一接口实现类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖.接下来将详细的向大家介绍Spring容器支持的三种依赖注入的方式以及具体配置方法:• 属性注入方法• ...
- Spring源码解析(四)Bean的实例化和依赖注入
我们虽然获得了Bean的描述信息BeanDefinition,但是什么时候才会真正的实例化这些Bean呢.其实一共有两个触发点,但是最后实际上调用的是同一个方法. 第一个:在AbstractAppli ...
- Spring配置及依赖注入
入门 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-we ...
随机推荐
- I Hate it-HDU1754 点修改+区间最大值
题意: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.不管你喜不喜欢, 现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然, ...
- mysql遇到java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
在连接数据库的url中,加上allowPublicKeyRetrieval=true from:https://blog.csdn.net/Gushiyuta/article/details/9323 ...
- WebSocket 反爬虫
目录 WebSocket握手验证反爬虫 WebSocket 消息校验反爬虫 WebSocket Ping 反爬虫 总结 WebSocket握手验证反爬虫 ! HTTP协议 请求头 服务器端创建 soc ...
- 高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185
最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了.现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧. 专题:http://acm.hust.edu.cn/vj ...
- 《C++ Primer(中文版)(第5版)》斯坦利·李普曼 (Stanley B. Lippman) (作者), 约瑟·拉乔伊 (Josee Lajoie) (作者), 芭芭拉·默 (Barbara E. Moo) (作者) azw3
内容简介: 这本久负盛名的C++经典教程,时隔八年之久,终迎来的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的——C++ 大师 Stanley B. Lippman 的丰富实践经验,C++标准委 ...
- 写给java web一年左右工作经验的人
摘要 大学就开始学习web,磕磕绊绊一路走过来,当中得到过开源社区很多的帮助,总结了这些年来的技术积累,回馈给开源社区. ps:图片都是从网上盗...感谢原作者. ps:文字千真万确都是我自己写的 ...
- 整合Spring时Service层为什么不做全局包扫描详解
合Spring时Service层为什么不做全局包扫描详解 一.Spring和SpringMVC的父子容器关系 1.讲问题之前要先明白一个关系 一般来说,我们在整合Spring和SpringMVC这两个 ...
- windows环境批量更改文件名
1.打开命令提示符,进入需更新文件所在的目录下(不熟悉的参考:https://blog.csdn.net/u012995964/article/details/53119516)2.批量命名 ...
- MySQL学习之SQL基础(一)DML
DML(data Manipulation language) INSERT DELETE UPDATE SELECT INSERT mysql> desc emp; +----------+- ...
- 第1节 IMPALA:2、架构介绍
impala的架构以及查询计划: impalad :从节点 对应启动一个impala-server的进程 ,主要负责各种查询计划,官方建议与所有的datanode安装在同一台机器上面 impala-s ...