Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – IOC) 理解依赖注入(DI – Dependency Injection)
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>