Bean XML 配置(3)- 依赖注入配置

本文介绍使用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>


浙ICP备17015664号 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载