`
annan211
  • 浏览: 461070 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring Ioc 依赖注入的三种方式:构造函数注入、setter方法注入和接口注入

 
阅读更多
spring 中 注入方式分为构造方法注入和setter方法注入

  1 构造方法注入,配置文件applicationContext.xml中:
<bean id="djNewsProvider" class="..FXNewsProvider">
<constructor-arg>
<ref bean="djNewsListener"/>
</constructor-arg>
<constructor-arg>
<ref bean="djNewsPersister"/>
</constructor-arg>
</bean>


简洁一点的写法:
<bean id="djNewsProvider" class="..FXNewsProvider">
<constructor-arg ref="djNewsListener"/>
<constructor-arg ref="djNewsPersister"/>
</bean>


有些时候,容器在加载XML配置的时候,因为某些原因,无法明确配置项与对象的构造方法参数列表的一一对应关系,就需要请<constructor-arg>的type或者index属性出马。比如,对象存在多个构造方法,当参数列表数目相同而类型不同的时候,容器无法区分应该使用哪个构造方法来实例化对象,或者构造方法可能同时传入最少两个类型相同的对象。
   (1) type属性
 public class MockBusinessObject {
private String dependency1;
private String dependency2;
public MockBusinessObject(String dependency)
{
this.dependency1 = dependency;
}
public MockBusinessObject(int dependency)
{
this.dependency2 = dependency;
}
…………
}
这个类有两个构造方法,但参数类型不同的。
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg>
<value>111111</value>
</constructor-arg>
</bean>  

如果从BeanFactory取得该对象并调用toString()查看的话,我们会发现Spring调用的是第一个构造方法,因为输出是如下内容:
.MockBusinessObject@f73c1[dependency1=111111,dependency2=0]

但是,如果我们想调用的却是第二个传入int类型参数的构造方法,又该如何呢?可以使用type属性,通过指定构造方法的参数类型来解决这一问题,配置内容如下代码所示:
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg type="int">
<value>111111</value>
</constructor-arg>
</bean>
(2)index 属性
当某个业务对象的构造方法同时传入了多个类型相同的参数时,Spring又该如何将这些配置中的信息与实际对象的参数一一对应呢?好在,如果配置项信息和对象参数可以按照顺序初步对应的话,Spring还是可以正常工作的。
public class MockBusinessObject {
private String dependency1;
private String dependency2;
public MockBusinessObject(String dependency1,String dependency2)
{
this.dependency1 = dependency1;
this.dependency2 = dependency2;
}
}
并且,配置内容如以下代码所示:
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg value="11111"/>
<constructor-arg value="22222"/>
</bean>

那么,我们可以得到如下对象:
MockBusinessObject@1ef8cf3[dependency1=11111,dependency2=22222]
但是,如果要让“11111”作为对象的第二个参数,而将“22222”作为第一个参数来构造对象,又该如何呢?好!可以颠倒配置项,如以下代码所示:
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg value="22222"/>
<constructor-arg value="11111"/>
</bean>

不过,还有一种方式,那就是像如下代码所示的那样,使用index属性:
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg index="1" value="11111"/>
<constructor-arg index="0" value="22222"/>
</bean>




2 setter方法注入

2. setter方法注入的XML之道
与构造方法注入可以使用<constructor-arg>注入配置相对应,Spring为setter方法注入提供了<property>元素。
<property>有一个name属性(attribute),用来指定该<property>将会注入的对象所对应的实例变量名称。之后通过value或者ref属性或者内嵌的其他元素来指定具体的依赖对象引用或者值,如以下代码所示:
<bean id="djNewsProvider" class="..FXNewsProvider">
<property name="newsListener">
<ref bean="djNewsListener"/>
</property>
<property name="newPersistener">
<ref bean="djNewsPersister"/>
</property>
</bean>

当然,如果只是使用<property>进行依赖注入的话,请确保你的对象提供了默认的构造方法,也就是一个参数都没有的那个。
以上配置形式还可以简化为如下形式:
<bean id="djNewsProvider" class="..FXNewsProvider">
<property name="newsListener" ref="djNewsListener"/>
<property name="newPersistener" ref="djNewsPersister"/>
</bean>


使用<property>的setter方法注入和使用<constructor-arg>的构造方法注入并不是水火不容的。实际上,如果需要,可以同时使用这两个元素:
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg value="11111"/>
<property name="dependency2" value="22222"/>
</bean>




转载自http://blog.163.com/ma13481280654@126/blog/static/732525372011102444356766/

  
分享到:
评论

相关推荐

    Spring 三种依赖注入方式.doc

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

    Spring IOC的注入方式总结

    在Spring中,IOC的主要实现方式有两种:依赖注入(Dependency Injection,简称DI)和基于接口的配置。下面将对这两种方式进行详细阐述。 一、依赖注入(Dependency Injection) 1. **构造器注入**:通过构造函数来...

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

    在Spring中,有两种主要的属性注入方式:setter方法注入和构造器注入。 1. Setter方法注入:这是最常用的方式,通过在类中定义带有`set`前缀的方法,Spring容器会调用这些方法来设置依赖。例如: ```java public ...

    Springioc注入Demo

    2. **setter注入**:通过setter方法来设置依赖对象,Spring容器会在对象创建后调用setter方法注入依赖。这种方式更符合JavaBean规范,使得对象可以在无依赖的情况下被实例化,但在使用前需要注入依赖。 3. **接口...

    springIOC控制反转 依赖注入实例

    2. setter方法注入:通过setter方法注入依赖对象,Spring容器会在对象创建后调用setter方法,设置依赖对象。 3. 接口注入:Spring提供了一种基于接口的注入方式,但这种方式在实际应用中较为少见,一般更多地使用...

    springIoc实现原理

    2. **设值注入**:使用setter方法注入依赖。 3. **接口注入**:通过实现特定的接口注入依赖。 Spring容器会根据配置自动调用合适的注入方式,为对象注入其依赖。 **四、Spring配置** Spring Ioc容器的配置可以...

    Spring IOC.pdf

    3. 注入依赖:当Bean需要使用到其他的Bean时,容器负责注入这些依赖,可以通过构造函数注入或者通过setter方法注入。 Spring IOC操作的详细步骤讲解截图可能会包含以下内容: 1. 创建Spring项目,并配置项目依赖...

    spring IOC容器依赖注入XML配置

    依赖注入可以通过多种方式实现,包括构造器注入、setter注入和接口注入。在XML配置中,我们通常使用setter注入,如上述示例所示。构造器注入可以通过指定带有参数的构造函数来完成,而接口注入则涉及实现一个接口,...

    spring IOC实现(墨者革离)

    依赖注入可以通过构造函数注入、setter方法注入或接口注入来实现,使得对象间的依赖关系在运行时动态地建立。 1. 构造函数注入:在类的构造函数中传入依赖的对象实例,这样在创建目标类实例时,依赖就已经被注入。 ...

    SpringIoc注入

    它可以应用在字段、构造函数、setter方法和方法参数上。Spring会根据类型匹配(默认)或通过`@Qualifier`指定的bean名称来找到合适的依赖。 **四、@Qualifier注解** `@Qualifier`与`@Autowired`配合使用,用于在多...

    Spring依赖注入使用setter设注入demo

    在这个名为“Spring依赖注入使用setter设注入demo”的示例中,我们将深入探讨如何通过setter方法实现Spring的依赖注入。 首先,理解依赖注入的基本思想:对象之间的依赖关系不是由对象自身管理,而是由外部容器(在...

    Spring注入的方式

    - 示例:`example4forSetter`可能是一个展示setter注入的例子,包含了注入依赖的setter方法,Spring容器会在初始化后调用这些方法注入依赖。 选择构造器注入还是setter注入取决于具体需求。构造器注入适用于核心...

    Spring 控制反转 依赖注入

    2. **setter注入**:使用setter方法注入依赖。容器会在对象创建后调用setter方法来设置依赖。 3. **接口注入**:较少使用,通过实现特定接口来注入依赖,但Spring并不直接支持,通常需要自定义实现。 **Spring的...

    SpringIoc示例代码

    构造器注入是在Bean实例化时通过构造函数传递依赖,而setter注入则是通过调用setter方法设置依赖。在`TestSpringIoc`中,可能会模拟不同的依赖注入场景,检查注入是否正确。 3. **Bean的生命周期管理**:Spring容器...

    Spring_依赖注入_面向接口编程

    1. **降低耦合**:对象不再直接创建依赖,而是通过构造函数、setter方法或者注解来接收依赖,降低了类与类之间的耦合度。 2. **增强可测试性**:依赖注入使得我们可以轻松地替换对象的依赖,便于进行单元测试。 3. *...

    JavaEE spring IoC入门案例

    构造器注入是在bean实例化时通过构造函数传递依赖,而setter注入则是通过调用setter方法设置依赖。 3. **bean的生命周期管理**:Spring容器负责bean的创建、初始化、使用和销毁。开发者可以通过定义初始化方法和...

    手写spring ioc(三) 资源org.zip

    在本资源"手写spring ioc(三) 资源org.zip"中,我们主要关注的是如何实现一个简易版的Spring IOC(Inversion of Control)容器,它涵盖了ioc的基本功能,包括解决循环依赖、使用构造器注入以及自动注入等核心特性。...

    模拟Spring的依赖注入

    在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)容器。它极大地简化了组件之间的依赖管理,提高了代码的可测试性和可维护性。本篇文章将深入...

    spring依赖注入的实现原理

    依赖注入有两种方式:设值注入(Setter Injection)和构造器注入(Constructor Injection)。Spring可以通过调用setter方法或构造器来注入依赖。 7. **AOP代理(AOP Proxy)** Spring通过AOP代理来实现对Bean的...

    关于spring boot中几种注入方法的一些个人看法

    @Autowired 是 Spring 中最常用的注入方法之一,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。@Autowired 的工作原理是,在启动 Spring IoC 时,容器自动装载了一个 ...

Global site tag (gtag.js) - Google Analytics