当前位置: 首页 > 知识库问答 >
问题:

对于XML构造函数注入Spring配置究竟是如何工作的,有一些疑问?

金瑞
2023-03-14

我正在研究Sping XML配置,我对构造函数注入配置有以下疑问。

我举了以下例子:

<bean id=“transferService” class=“com.acme.TransferServiceImpl”>
    <constructor-arg ref=“accountRepository”/>
    <constructor-arg ref=“customerRepository”/>
</bean>

<bean id=“accountRepository” class=“com.acme.AccountRepositoryImpl”/>
<bean id=“customerRepository” class=“com.acme.CustomerRepositoryImpl”/>

好的。我很清楚会发生什么:首先,帐户存储库bean被创建为一个com.acme.的帐户存储库实例,而客户存储库bean被创建为一个com.acme.的客户存储库实例

然后创建transferService bean作为com的一个istance。顶峰TransferServiceImpl类和前2个bean在bean构造期间被注入为构造函数的输入参数。

这是清楚的。我的怀疑与以下事实有关:我在文件中读到:

根据类型注入的参数

这到底意味着什么?在我看来,在之前的配置中,bean是根据其id注入的。

前面的语句意味着Spring检查类型,例如,如果TransferServiceImpl类的构造函数采用2个参数,其类型为AccountRepositoryImpl和CustomerRepositoryImpl,那么它会执行匹配吗?

这意味着:

<bean id=“transferService” class=“com.acme.TransferServiceImpl”>
    <constructor-arg ref=“accountRepository”/>
    <constructor-arg ref=“customerRepository”/>
</bean>

与以下内容相同:

<bean id=“transferService” class=“com.acme.TransferServiceImpl”>
    <constructor-arg ref=“customerRepository”/>
    <constructor-arg ref=“accountRepository”/>
</bean>

?

改变参数的顺序,结果不会改变,因为Spring为我执行匹配?如果是,如果在构造函数中我有更多具有相同类型的参数,会发生什么?

tnx

共有2个答案

邓德厚
2023-03-14

以下是在基于构造函数的注入中处理歧义的方法:

场景1:如果有多个参数,则需要使用type属性。例如。

<constructor-arg ref=“accountRepository” type="com.acme.AccountRepositoryImpl" />
<constructor-arg ref=“customerRepository” type="com.acme.CustomerRepositoryImpl" />

场景2:如果您有多个相同类型的参数,则需要使用index属性,例如。

<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
洪高扬
2023-03-14

如果每个构造函数参数都有不同的类型(Spring自动处理),则可以在XML代码中混合顺序。如果有多个具有相同类型,那么Spring只会将它们按在构造函数定义中出现的顺序排列。让我们举个例子:

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }
}

public class Project {
    private User user1;
    private User user2;
    private int cost;

    public Project(User user1, User user2, int cost) {
        this.user1 = user1;
        this.user2 = user2;
        this.cost = cost;
    }
}

Bean定义如下:

<bean id="user1" class="demo.User">
    <constructor-arg value="User1" />
</bean>

<bean id="user2" class="demo.User">
    <constructor-arg value="User2" />
</bean>

<bean id="proj" class="demo.Project">
    <constructor-arg value="100" />
    <constructor-arg ref="user2" />
    <constructor-arg ref="user1" />
</bean>

将由Spring处理,不会引发异常,并将生成具有属性的类Project的对象:

  • user1=bean(user2)

如果您想纠正错误,请始终为构造函数arg设置索引:

<bean id="proj" class="demo.Project">
    <constructor-arg index="0" ref="user1" />
    <constructor-arg index="1" ref="user2" />
    <constructor-arg index="2" value="100" />
</bean>

或者为了更好的易读性-set name属性:

<bean id="proj" class="demo.Project">
    <constructor-arg name="cost" value="100" />
    <constructor-arg name="user2" ref="user2" />
    <constructor-arg name="user1" ref="user1" />
</bean>

请记住:

(...) 要使这项工作开箱即用,您的代码必须在启用调试标志的情况下编译,以便Spring可以从构造函数中查找参数名。如果无法使用调试标志编译代码(或不想),可以使用@ConstructorProperties JDK注释显式命名构造函数参数

阅读更多Spring参考

 类似资料:
  • 问题内容: 有没有一种方法可以用XML编写Spring bean,以便在构造函数具有varargs参数类型时使用构造函数注入?IE,有没有一种方法可以指定数组,也可以指定列表? 例如: 问题答案: 因为是您可以使用的数组:

  • 问题内容: 假设我有一些类似以下的课程。(为简单起见,这是一个虚构类。) 由于我使用不同的实现,并且可能想对该发送功能进行单元测试,因此我认为我应该注入in 的方法。但是我该怎么做呢? 我见过的所有我理解的Guice示例似乎都是在构造函数中进行注入的: 但是我的类在其构造函数中接受了一个参数,我不想注入该参数。那我该怎么办呢? (注意:我是一个完整的Google Guice noob。我认为我了解

  • 我有一个类< code >配置: 配置java 我如何将它注入到某个构造函数中,例如: 我希望这个字符串 从配置中注入了值。这可能吗?

  • 内部构造函数的准确定义是什么?在Julia-V0.6+中,“任何可以使用签名(注意部分)调用的构造函数都是内部构造函数”是正确的吗? 正如下面的注释中所讨论的,仅限于外部的构造函数实际上是吗? 使用检查方法是否是内部/外部构造函数是否正确? Julia自动定义的默认构造函数与用户显式定义的相应构造函数有什么不同? 顺便说一句,我知道如何使用以及何时使用内部构造函数。我知道什么是内部构造函数,直到只

  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。

  • 我写了下面的测试代码在Java使用ReentantReadWriteLock来了解公平和不公平模式之间的区别。然而,我看到在两种模式下,结果和输出总是相同的。它似乎总是在公平模式下工作。谁能解释一下,在何种情况下,公平和不公平模式会导致不同的行为? 输出总是: 当我将锁创建更改为公平模式时,上面的输出是我期望看到的: 对于非公平模式,我希望看到以下输出: