`

Spring依赖注入配置详解

阅读更多

   bean的属性及构造器参数既可以引用容器中的其他bean,也可以是内联(inline)bean。在spring的XML配置中使用<property/>和<constructor-arg/>元素定义。

     1.直接变量(基本类型、Strings 类型等。)

     JavaBean PropertyEditor将用于把字符串从java.lang.String类型转化为实际的属性或参数类型。

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  
  <!-- results in a setDriverClassName(String) call -->
  <property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property name="url">
    <value>jdbc:mysql://localhost:3306/mydb</value>
  </property>
  <property name="username">
    <value>root</value>
  </property>
  <property name="password">
    <value>masterkaoli</value>
  </property>
</bean>

 可以在<property/> 和<constructor-arg/> 元素内部使用'value' 属性,这样会使我们的配置更简洁,比如下面的配置:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  
  <!-- results in a setDriverClassName(String) call -->
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
  <property name="username" value="root"/>
  <property name="password" value="masterkaoli"/>
</bean>

Spring团队更倾向采用属性方式(使用<value/> 元素)来定义value值。当然我们也可以按照下面这种方式配置一个java.util.Properties 实例:

<bean id="mappings" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            
   <!-- typed as a java.util.Properties -->
   <property name="properties">
      <value>
         jdbc.driver.className=com.mysql.jdbc.Driver
         jdbc.url=jdbc:mysql://localhost:3306/mydb
      </value>
   </property>
</bean>

 看到什么了吗?如果采用上面的配置,Spring容器将使用JavaBean PropertyEditor<value/> 元素中的文本转换为一个java.util.Properties 实例。由于这种做法的简单,因此Spring团队在很多地方也会采用内嵌的<value/> 元素来代替value 属性。

 

2.idref 元素

idref 元素用来将容器内其它bean的id 传给<constructor-arg/><property/> 元素,同时提供错误验证功能。

<bean id="theTargetBean" class="..."/>

<bean id="theClientBean" class="...">
    <property name="targetName">
        <idref bean="theTargetBean" />
    </property>
</bean>

 上述bean定义片段完全地等同于(在运行时)以下的片段:

<bean id="theTargetBean" class="..." />

<bean id="client" class="...">
    <property name="targetName" value="theTargetBean" />
</bean>

第一种形式比第二种更可取的主要原因是,使用idref标记允许容器在部署时 验证所被引用的bean是否存在。而第二种方式中,传给client bean的targetName属性值并没有被验证。任何的输入错误仅在client bean实际实例化时才会被发现(可能伴随着致命的错误)。如果client bean 是prototype类型的bean,则此输入错误(及由此导致的异常)可能在容器部署很久以后才会被发现。

  此外,如果被引用的bean在同一XML文件内,且bean名字就是bean id,那么可以使用local属性,此属性允许XML解析器在解析XML文件时对引用的bean进行验证。

<property name="targetName">
   <!-- a bean with an id of 'theTargetBean' must exist; otherwise an XML exception will be thrown -->
   <idref local="theTargetBean"/>
</property>

    上面的例子中,与在ProxyFactoryBean bean定义中使用<idref/>元素指定AOP interceptor的相同之处在于:如果使用<idref/>元素指定拦截器名字,可以避免因一时疏忽导致的拦截器ID拼写错误。

 

3.引用其它的bean(协作者)

      在<constructor-arg/><property/> 元素内部还可以使用ref 元素。该元素用来将bean中指定属性的值设置为对容器中的另外一个bean的引用。如前所述,该引用bean将被作为依赖注入,而且在注入之前会被初始化(如果是singleton bean则已被容器初始化)。尽管都是对另外一个对象的引用,但是通过id/name指向另外一个对象却有三种不同的形式,不同的形式将决定如何处理作用域及验证。

       第一种形式也是最常见的形式是通过使用<ref/> 标记指定bean 属性的目标bean,通过该标签可以引用同一容器或父容器内的任何bean(无论是否在同一XML文件中)。XML 'bean '元素的值既可以是指定bean的id 值也可以是其name 值。

<ref bean="someBean"/>

      第二种形式是使用ref的local 属性指定目标bean,它可以利用XML解析器来验证所引用的bean是否存在同一文件中。local 属性值必须是目标bean的id属性值。如果在同一配置文件中没有找到引用的bean,XML解析器将抛出一个例外。如果目标bean是在同一文件内,使用local方式就是最好的选择(为了尽早地发现错误)。

<ref local="someBean"/>

   第三种方式是通过使用ref的parent 属性来引用当前容器的父容器中的bean。parent 属性值既可以是目标bean的id 值,也可以是name 属性值。而且目标bean必须在当前容器的父容器中。使用parent属性的主要用途是为了用某个与父容器中的bean同名的代理来包装父容器中的一个bean(例如,子上下文中的一个bean定义覆盖了他的父bean)。

  <!-- in the parent context --> 
<bean id="accountService" class="com.foo.SimpleAccountService">  <!-- insert dependencies as required as here --> </bean>
<!-- in the child (descendant) context -->
<bean id="accountService"  <-- notice that the name of this bean is the same as the name of the 'parent' bean
      class="org.springframework.aop.framework.ProxyFactoryBean">
      <property name="target">
          <ref parent="accountService"/>  <-- notice how we refer to the parent bean
      </property>
    <!-- insert other configuration and dependencies as required as here -->
</bean>

 

4. 内部bean(使用内部bean,但该bean不能被其他bean使用)

所谓的内部bean(inner bean)是指在一个bean的<property/><constructor-arg/> 元素中使用<bean/> 元素定义的bean。内部bean定义不需要有id或name属性,即使指定id 或 name属性值也将会被容器忽略。

<bean id="outer" class="...">
  <!-- instead of using a reference to a target bean, simply define the target bean inline -->
  <property name="target">
    <bean class="com.example.Person"> <!-- this is the inner bean -->
      <property name="name" value="Fiona Apple"/>
      <property name="age" value="25"/>
    </bean>
  </property>
</bean>

 注意:内部bean中的scope标记及id或name属性将被忽略。内部bean总是匿名的且它们总是prototype模式的。同时将内部bean注入到包含该内部bean之外的bean是不可能的。

 

5.集合类型

通过<list/><set/><map/><props/> 元素可以定义和设置与Java Collection 类型对应ListSetMapProperties 的值。

javaBean代码:

package example;
public class ExampleBean  {
	private Set<String> sets = new HashSet<String>();
	private List<String> lists = new ArrayList<String>();
	private Properties properties = new Properties();
	private Map<String, String> maps = new HashMap<String, String>();
	
	public Map<String, String> getMaps() {
		return maps;
	}

	public void setMaps(Map<String, String> maps) {
		this.maps = maps;
	}

	public Properties getProperties() {
		return properties;
	}

	public void setProperties(Properties properties) {
		this.properties = properties;
	}

	public Set<String> getSets() {
		return sets;
	}

	public void setSets(Set<String> sets) {
		this.sets = sets;
	}

	public List<String> getLists() {
		return lists;
	}

	public void setLists(List<String> lists) {
		this.lists = lists;
	}
}

 xml配置文件如下:

<bean id="personService" class="example.ExampleBean">
          	<property name="sets">
          		<set>
          			<value>第一个</value>
          			<value>第二个</value>
          			<value>第三个</value>
          		</set>
          	</property>
          	<property name="lists">
          		<list>
          			<value>第一个list元素</value>
          			<value>第二个list元素</value>
          			<value>第三个list元素</value>
          		</list>
          	</property>
          	<property name="properties">
          		<props>
          			<prop key="key1">value1</prop>
          			<prop key="key2">value2</prop>
          			<prop key="key3">value3</prop>
          		</props>
          	</property>
          	<property name="maps">
          		<map>
          			<entry key="key-1" value="value-1"/>
          			<entry key="key-2" value="value-2"/>
          			<entry key="key-3" value="value-3"/>
          		</map>
          	</property>
          </bean>
 
<bean id="moreComplexObject" class="example.ComplexObject">
  <!-- results in a setAdminEmails(java.util.Properties) call -->
  <property name="adminEmails">
    <props>
        <prop key="administrator">administrator@example.org</prop>
        <prop key="support">support@example.org</prop>
        <prop key="development">development@example.org</prop>
    </props>
  </property>
  <!-- results in a setSomeList(java.util.List) call -->
  <property name="someList">
    <list>
        <value>a list element followed by a reference</value>
        <ref bean="myDataSource" />
    </list>
  </property>
  <!-- results in a setSomeMap(java.util.Map) call -->
  <property name="someMap">
    <map>
        <entry>
            <key>
                <value>an entry</value>
            </key>
            <value>just some string</value>
        </entry>
        <entry>
            <key>
                <value>a ref</value>
            </key>
            <ref bean="myDataSource" />
        </entry>
    </map>
  </property>
  <!-- results in a setSomeSet(java.util.Set) call -->
  <property name="someSet">
    <set>
        <value>just some string</value>
        <ref bean="myDataSource" />
    </set>
  </property>
</bean>

 注意:map的key或value值,或set的value值还可以是以下元素:

bean | ref | idref | list | set | map | props | value | null

 

 

分享到:
评论

相关推荐

    spring依赖注入底层详解

    Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的底层实现机制。 首先,我们要...

    Spring的注入方式详解

    Spring 框架是 Java 开发中非常重要的一个组件,它提供了一种强大的依赖注入(Dependency Injection,简称 DI)机制,使得对象之间的依赖关系可以通过配置文件或者注解来管理,而不是硬编码在类的内部。这有助于提高...

    模仿Spring依赖注入

    【Spring依赖注入详解】 在Java开发中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)功能而闻名。依赖注入是一种设计模式,它允许我们解耦组件,使我们的应用程序更加灵活,易于测试和维护。本篇...

    spring3.0依赖注入详解

    ### Spring 3.0依赖注入详解 #### 引言 Spring框架自2.0版本起,不断优化其依赖注入机制,引入了一系列注解以简化Java应用程序的开发过程。特别是Spring 3.0版本,对依赖注入(DI)进行了深度拓展,引入了基于...

    Spring Ioc 注解 依赖注入

    ### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,最初是为了解决企业级应用开发中的复杂性问题而诞生的。Spring框架的核心特性包括IoC(Inversion of ...

    (转)Spring 3.0 注解注入详解

    3. **@Required**:此注解用在字段或setter方法上,表示该字段或方法必须通过依赖注入来设置,否则容器启动时会抛出异常。这通常用于强制确保某些关键依赖被正确地注入。 4. **@Value**:这个注解可以用于注入基本...

    详解Spring基于Annotation的依赖注入实现

    Spring的核心特性之一就是依赖注入,它通过在运行时自动配置对象及其依赖关系,极大地简化了Java应用程序的开发过程。 ### 依赖注入(DI) 依赖注入是一种设计模式,用于减少代码之间的耦合度。在传统的编程方式中...

    Spring 依赖注入

    ### Spring 依赖注入详解 #### 一、依赖注入(DI)概述 依赖注入(Dependency Injection,简称 DI)是一种设计模式,旨在减少代码间的耦合度并简化对象的创建过程。这种模式通过将对象间的依赖关系从对象内部转移...

    Spring 核心机制(依赖注入)

    ### Spring核心机制——依赖注入详解 #### 一、引言 Spring框架作为一款优秀的轻量级Java应用开发框架,其核心理念之一就是依赖注入(Dependency Injection, DI)。依赖注入不仅能够帮助开发者降低代码间的耦合度...

    Spring.net(依赖注入应用)

    **Spring.NET 框架详解:依赖注入与应用实践** Spring.NET 是一个开源的企业级应用程序框架,它在.NET平台上实现了类似Java Spring的核心功能,其中包括了依赖注入(Dependency Injection,DI)这一重要设计模式。...

    Spring依赖注入

    ### Spring依赖注入详解 #### 一、什么是IoC与DI? 在探讨Spring框架中的依赖注入之前,我们首先需要了解两个核心概念:IoC(Inversion of Control)与DI(Dependency Injection)。这两个概念是理解Spring框架...

    spring依赖注入

    标题:“spring依赖注入” 描述详解: 在Spring框架中,依赖注入是一种关键的设计模式,用于管理和配置应用程序中的对象及其依赖关系。依赖注入分为两种主要类型:属性注入和对象注入。 1. **属性注入**:属性...

    spring 控制反转和依赖注入.docx

    Spring 控制反转和依赖注入基础知识详解 Spring 框架是 Java 企业级开发的轻量级开发框架,于 2003 年创建,主要用于解决企业级开发的复杂性。其主要优势在于分层架构,允许在不同层级中使用一个组件(其他框架)...

    spring注解注入示例详解-(三)

    在Spring框架中,注解注入是一种非常重要的依赖注入方式,它允许开发者在不编写XML配置文件的情况下,通过在类的属性上添加特定的注解来完成对象的实例化和依赖关系的绑定。本文将深入探讨Spring注解注入的原理、...

    spring配置详解

    Spring通过依赖注入(Dependency Injection,DI)管理bean之间的关系。有三种方式实现依赖注入:构造器注入、设值注入和接口注入。设值注入的例子如上所示,通过`&lt;property&gt;`标签注入属性值。构造器注入则是通过指定...

    Spring依赖注入的两种方式(根据实例详解)

    Spring依赖注入的两种方式详解 在Spring框架中,依赖注入(Dependency Injection)是指框架为对象提供依赖项,而不是由对象创建它们的依赖项。这种技术使得对象之间的耦合度降低,提高了系统的灵活性和可维护性。...

    spring配置文件详解

    这些Bean对象之间可以通过依赖注入的方式进行关联和配置。 在给定的配置文件中,我们可以看到以下几个重要的配置部分: 首先是数据源的配置,我们使用Apache Commons DBCP提供的BasicDataSource来配置数据源。在这...

    Spring系列之依赖注入的三种方式.docx

    【Spring 依赖注入详解】 在 Spring 框架中,依赖注入(Dependency Injection,简称 DI)是一种关键的设计模式,它允许我们解耦组件之间的依赖关系,使得代码更加灵活,易于测试和维护。依赖注入的三种主要方式是:...

    spring所有配置文件详解

    `applicationContext.xml`是Spring容器使用的主配置文件之一,用于定义Spring中的Bean以及它们之间的依赖关系。 #### 三、applicationContext.xml详解 **1. 文件结构** ```xml &lt;!-- 头文件,定义XML版本及编码 --...

Global site tag (gtag.js) - Google Analytics