Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用混合配置的Spring依赖项注入时创建多个对象_Java_Spring_Dependency Injection - Fatal编程技术网

Java 使用混合配置的Spring依赖项注入时创建多个对象

Java 使用混合配置的Spring依赖项注入时创建多个对象,java,spring,dependency-injection,Java,Spring,Dependency Injection,我似乎遇到了这个问题,即当我使用注释为某些类配置依赖注入时,以及通过xml文件中的配置为其他类配置依赖注入时 我有一个构造函数注入,我需要将SuperBean对象注入到两个类的构造函数中,它们得到SuperBean的不同实例,因为一个配置了注释,另一个配置在xml文件中,所以SuperBean定义如下: @Component("SuperBean") public class SuperBean extends InjectableBean { 已配置注释构造函数的类的构造函数: @Autow

我似乎遇到了这个问题,即当我使用注释为某些类配置依赖注入时,以及通过xml文件中的配置为其他类配置依赖注入时

我有一个构造函数注入,我需要将
SuperBean
对象注入到两个类的构造函数中,它们得到
SuperBean
的不同实例,因为一个配置了注释,另一个配置在xml文件中,所以
SuperBean
定义如下:

@Component("SuperBean")
public class SuperBean extends InjectableBean {
已配置注释构造函数的类的构造函数:

@Autowired
    public CustomBean(@Value("Any name") String name, @Qualifier("SuperBean") SuperBean superBean) {
        super();
        this.superBean = superBean;
        this.name = name;
    }
public CustomXmlBean(String name, SuperBean superBean) {
        super(name, superBean);
    }
和另一类的构造函数:

@Autowired
    public CustomBean(@Value("Any name") String name, @Qualifier("SuperBean") SuperBean superBean) {
        super();
        this.superBean = superBean;
        this.name = name;
    }
public CustomXmlBean(String name, SuperBean superBean) {
        super(name, superBean);
    }
它的配置在xml文件中:

    <bean id="CustomXmlBean" class="org.arturas.summerfav.beans.CustomXmlBean">
    <constructor-arg name="name" type="String" value="The Big Custom XML Bean" />
    <constructor-arg>
        <bean name="SuperBean" class="org.arturas.summerfav.beans.SuperBean" />
    </constructor-arg>
</bean>
CustomXmlBean
类:

@Component("CustomBean")
public class CustomBean extends InjectableBean {

    private String name;
    private SuperBean superBean;

    /**
     * @param name - Bean name
     */
    @Autowired
    public CustomBean(@Value("Any name") String name, @Qualifier("SuperBean") SuperBean superBean) {
        super();
        this.superBean = superBean;
        this.name = name;
    }
public class CustomXmlBean extends CustomBean {

public CustomXmlBean(String name, SuperBean superBean) {
    super(name, superBean);
}

为什么构造器返回一个不同的类CustomBean?你能发布整个源代码吗

编辑:将评论中的答案添加到主答案中


对不起,我被最初的帖子误导了。试试这个

<constructor-arg index="1" ref="SuperBean"/>


您试过给他们取相同的名字吗?我以前从未用Spring尝试过,但它可能会起作用(或者创建2个,只保留1个)。@DanielWilliams但在这些代码示例中,我相信名称已经相同了?我尝试在xml文件中使用id而不是名称,但结果是我误读了发生的事情。您可以在XML中尝试这样做吗?这更像是一个注释而不是一个答案。这是两个不同(但非常相似)的类,这就是为什么它们都有自己的构造函数,一个有CustomBean,另一个有CustomXMLBean,但它们采用相同的构造函数参数,并且应该加载相同的SuperBean。抱歉,我被最初的帖子误导了。试试这个谢谢,这个很好用。但是你能解释一下这里有什么吗?index=“1”表示我们在引用构造函数中的第二个参数,对吗?所以,如果它是index=“1”,那么它将是index=“0”?ref=“SuperBean”意味着它引用文件中某处定义的bean,或者使用注释作为“SuperBean”?是名称还是id?是的,您是对的,您可以使用名称/位置索引连接依赖项。您在构造函数中提供了一个新的SuperBean实例。如果ID相同,Spring将“覆盖”bean定义——它们将按照容器遇到的顺序被覆盖。假设在同一个/other xml/任何其他配置机制中有两个bean定义,第二个将覆盖第一个bean定义。