`

Spring 中设置依赖注入

阅读更多
示例代码:

package org.sixsun.spring;

public class HelloBean {
    private String name;
    private String helloWord;

    public HelloBean() {
    }
   
    public HelloBean(String name, String helloWord) {
        this.name = name;
        this.helloWord = helloWord;
    }
   
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }

    public void setHelloWord(String helloWord) {
        this.helloWord = helloWord;
    }
    public String getHelloWord() {
        return helloWord;
    }
}

1. Constructor injection

1.1 在Bean的配置文件中,使用<constructor-arg>来表示将使用Constructor injection,由于使用Constructor injection时并不如Setter injection时拥有setXXX()这样易懂的名称,所以必须指定参数的位置索引,index属性就是用于指定对象将注入至建构函式中的哪一个参数,参数的顺序指定中,第一个参数的索引值是0,第二个是1,依此类推。

示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="helloBean"
          class=" org.sixsun.spring.HelloBean">
        <constructor-arg index="0">
            <value>sixsun</value>
        </constructor-arg>
        <constructor-arg index="1">
            <value>HelloSpring</value>
        </constructor-arg>
    </bean>
</beans>

1.2 如果constructor上只有一个参数,则不必指定index属性。

示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="helloBean"
          class=" org.sixsun.spring.HelloBean">
        <constructor-arg>
            <value>sixsun</value>
        </constructor-arg>
    </bean>
</beans>


1.3 若有两个以上的参数,而参数类型各不相同的话,可以使用type来指定constructor上的参数类型。

示例代码:


package org.sixsun.spring;

public class HelloBean {
    private String name;
    private Integer age;

    public HelloBean() {
    }
   
    public HelloBean(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
   
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    public Integer getAge() {
        return age;
    }
}

示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="helloBean"
          class=" org.sixsun.spring.HelloBean">
        <constructor-arg type="java.lang.String">
            <value>sixsun</value>
        </constructor-arg>
        <constructor-arg type="java.lang.Integer">
            <value>23</value>
        </constructor-arg>
    </bean>
</beans>

2. property injection

示例代码:


package org.sixsun.spring;

import java.util.Date;

public class HelloBean {
    private String helloWord;
    private Date date;
   
    public void setHelloWord(String helloWord) {
        this.helloWord = helloWord;
    }
    public String getHelloWord() {
        return helloWord;
    }
    public void setDate(Date date) {
        this.date = date;
    }   
    public Date getDate() {
        return date;
    }
}

2.1 直接指定值或是使用<ref>直接指定参考至其它的Bean

示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="dateBean" class="java.util.Date"/>
   
    <bean id="helloBean" class="org.sixsun.spring.HelloBean">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
        <property name="date">
            <ref bean="dateBean"/>
        </property>
    </bean>
</beans>

2.2 也可以用内部Bean的方式来注入依赖关系

示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="helloBean" class="org.sixsun.spring.HelloBean">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
        <property name="date">
            <bean id="dateBean" class="java.util.Date"/>
        </property>
    </bean>
</beans>

3. 自动绑定

直接指定值或是使用<ref>直接指定参考至其它的Bean,Spring也支持隐式的自动绑定,您可以通过类型(byType)或名称(byName)将Bean绑定至其它Bean上对应的属性:

3.1 byType

    在配置文件中,并没有指定helloBean的Date属性,而是透过自动绑定,由于autowire指定了byType,所以会根据helloBean 的 Date属性所接受的类型,判断是否有类似的类型对象,并将之绑定至helloBean的Date属性上,如果byType无法完成绑定,则抛出 org.springrframework.beans.factory.UnsatisfiedDependencyExcpetion异常。

示例配置:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="dateBean" class="java.util.Date"/>
    <bean id="helloBean"
          class="org.sixsun.spring.HelloBean"
          autowire="byType">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
    </bean>
</beans>

3.2 byName

    也可以指定byName来绑定,则Spring会根据bean的别名与属性名称是否符合来进行自动绑定,举个例子来说,如果是byName而Date属性要完成依赖注入的话,则必须修改一下第一个Bean的id值为date:

示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="date" class="java.util.Date"/>
    <bean id="helloBean"
          class="org.sixsun.spring.HelloBean"
          autowire="byName">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
    </bean>
</beans>

3.3 constructor也可以尝试进行自动绑定

    由于autowire设定为constructor,在建立绑定关系时,Spring容器会试图比对容器中的Bean及相关的建构方法,在类型上是否有符合,如果有的话,则选用该建构方法来建立Bean实例,例如上例中,HelloBean的带参数建构方法与date这个Bean的类型相符,于是选用该构造方法来建构实例,并将date这个Bean注入给它,如果无法完成绑定,则抛出 org.springframework.beans.factory.UnsatisfiedDependencyException异常。

示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="date" class="java.util.Date"/>
    <bean id="helloBean"
          class="org.sixsun.spring.HelloBean"
          autowire="constructor">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
    </bean>
</beans>

3.4 autodetect

使用autodetect时,会尝试使用constructor,然后使用byType,哪一个先符合就先用。

示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="date" class="java.util.Date"/>
    <bean id="helloBean"
          class="org.sixsun.spring.HelloBean"
          autowire="autodetect">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
    </bean>
</beans>

3.5 其它:

    隐式的自动绑定没办法从配置文件中清楚的看到是否每个属性都完成设定,我们可以加入相依检查,在<bean>上加入dependency- check,有四种相依检查方式:simple、objects、all、none。

simple只检查简单的属性,像是原生(primitive)数据型态或字符串对象;
objects检查对象属性;
all则检查全部的属性;
none是预设,表示不检查相依性;

示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="date" class="java.util.Date"/>
    <bean id="helloBean"
          class="org.sixsun.spring.HelloBean"
          autowire="autodetect"
          dependency-check="all">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
    </bean>
</beans>


4. 集合对象注入:

对于像数组、java.util.List、java.util.Set、java.util.Map等集合对象,在注入前必须填充入一些对象至集合中,然后再将集合对象注入至所需的Bean中,例如若有个Bean如下:

示例代码:

public class SomeBean {
    private String[] someStrArray;
    private SomeObj[] someObjArray;
    private List someList;
    private Map someMap;
    ....

}

示例配置:
<beans>
    <bean id="someBean" class="onlyfun.caterpillar.SomeBean">
        <property name="someArray">
            <list>
                <value>Hello!Justin!</value>
                <value>Hello!Momor!</value>
                <value>Hello!Bush!</value>
            </list>
        </property>
        <property name="someObjArray">
            <list>
                <ref bean="someObj1"/>
                <ref bean="someObj2"/>
            </list>
        </property>
        <property name="someList">
            <list>
                 <value>Hello!Justin!</value>
                 <ref bean="someObj1"/>
                 <ref bean="someObj2"/>
            </list>
        </property>
        <property name="someMap">
            <map>
                 <entry key="somekey1">
                     <ref bean="someObj1"/>
                 </entry>
                 <entry key="somekey2">
                     <value>Hello!Justin!</value>
                 </entry>
            </map>
        </property>
    </bean>
</beans>

上面的Bean定义文件是个综合示范,数组与List对象都是用<list>卷标来设定,而Map对象使用<map>卷标设定,并需要一个key值设定。

Set的使用<set>标签,例如:
<set>
    <value>a set element</value>
    <ref bean="otherBean"/>
    <ref bean="anotherBean"/>
</set>

您也可以注入java.util.Properties,Bean定义档的写法示范如下:
<bean id=....>
        ....
        <property name="someProperties">
            <props>
                <prop key="someProkey1">
                    someProValue1
                </prop>
                <prop key="someProkey2">
                    someProValue2
                </prop>
            </props>
        </property>
    </bean>
分享到:
评论

相关推荐

    spring学习:依赖注入的几种方式讨论

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...

    Spring Ioc 注解 依赖注入

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

    Spring 控制反转 依赖注入

    **Spring 框架中的控制反转 (IoC) 和依赖注入 (DI)** 在软件开发中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,转交给一个外部容器(如Spring框架)。...

    spring依赖注入底层详解

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

    spring依赖注入

    Spring依赖注入是Spring框架的核心特性之一,它使得对象之间的依赖关系得以解耦,增强了代码的可测试性和可维护性。依赖注入(Dependency Injection,简称DI)的理念是,一个对象不应该负责寻找并创建它所依赖的对象...

    Spring 三种依赖注入方式.doc

    Spring 框架中提供了多种依赖注入方式,其中最常用的三种依赖注入方式分别是接口注入、设值注入和构造函数注入。下面,我们将分别对这三种依赖注入方式进行详细的介绍和分析。 一、接口注入 接口注入是指通过接口...

    java中spring依赖注入的简单例子

    javaEE 开发中 现在最成熟的框架之一应该就是spring了 spring框架最强大的地方就是实现了依赖注入 也叫控制反转 最近的一个项目中用的就是 spring框架 spring框架是工厂模式的应用结合了MVC的设计思想 大家可以...

    Spring中的依赖注入.rar

    Spring框架是Java应用程序开发中的一个核心框架,尤其以其强大的依赖注入(Dependency Injection,简称DI)功能闻名。依赖注入是面向切面编程(AOP)的一个关键原则,它允许开发者将对象之间的依赖关系解耦,使得...

    Spring的依赖注入,与前置通知的实例

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它允许对象之间的耦合性降低,使得代码更易于测试和维护。依赖注入的核心思想是将一个对象依赖的其他对象通过构造函数、setter方法...

    spring依赖注入的实现原理

    Spring依赖注入(Dependency Injection,简称DI)是Java应用开发中常用的设计模式,它极大地提高了代码的可测试性和可维护性。在Spring框架中,依赖注入是核心特性之一,通过控制反转(Inversion of Control,IoC)...

    第三章 Spring4 依赖注入

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种核心的设计模式,它允许我们创建松耦合的代码,提高软件的可测试性和可维护性。Spring4版本进一步优化了这一特性,使其更加灵活和强大。本篇文章将...

    模仿Spring依赖注入

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

    Spring.net(依赖注入应用)

    ### 二、Spring.NET 中的依赖注入 Spring.NET 提供了多种依赖注入方式,包括构造函数注入、属性注入和方法注入。以下分别介绍: 1. **构造函数注入**:通过在类的构造函数中传递依赖对象的实例来实现。这种方式...

    Spring 核心机制(依赖注入)

    在Spring框架中,依赖注入和控制反转实际上是同一概念的不同表达形式。当程序中的组件需要另一个组件的帮助时,通常是由调用者(即需要帮助的角色)来创建被调用者(即提供帮助的角色)的实例。但在Spring中,这个...

    spring依赖注入三种方式 测试源码

    通过阅读和理解这些源码,你可以更深入地了解Spring依赖注入的工作原理及其在项目中的具体使用。 在进行依赖注入时,Spring使用BeanFactory或ApplicationContext作为容器,负责创建、管理和装配Bean。容器读取配置...

    Spring依赖注入的方式

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入方式,包括构造器注入、设值注入...

    spring依赖注入例子

    在Spring中,依赖注入可以通过XML配置、注解或Java配置实现。本例子主要关注基于注解的依赖注入,这是一个现代且更简洁的方法。 首先,让我们理解一下依赖注入的基本概念。在面向对象编程中,一个类可能会依赖于...

    Spring Ioc(依赖注入)入门例子--属性注入

    在本例“Spring Ioc(依赖注入)入门例子--属性注入”中,我们将关注如何通过属性注入来管理依赖。 属性注入是指Spring容器将一个对象的属性值设置为另一个对象的引用。这通常用于将服务对象注入到需要使用它们的...

    Spring依赖注入检查.

    本文将深入探讨Spring依赖注入的概念、工作原理以及如何在实际项目中应用。 依赖注入(Dependency Injection,简称DI)是一种设计模式,它允许组件之间通过外部源来管理其依赖关系,而不是由组件自己来创建或查找...

Global site tag (gtag.js) - Google Analytics