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

时间:2013-08-08 04:57:24

标签: java spring dependency-injection

我似乎遇到了这个问题,当我使用注释为某些类配置依赖注入时,以及通过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);
    }

它是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>

所以我似乎注意到xml配置的类似乎有SuperBean的不同实例,因为在SuperBean对象上进行的更改在通过xml访问时不会反映出来配置类。

那么如何确保SuperBean只有一个实例? (假设我想保留两种配置方式 - 通过xml文件和注释)

修改:添加更多来源:

CustomBean类:

@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;
    }

CustomXmlBean类:

public class CustomXmlBean extends CustomBean {

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

1 个答案:

答案 0 :(得分:0)

为什么构造函数返回另一个类CustomBean - 你能发布整个源吗?

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

抱歉,我在最初的帖子中误导了。试试这个

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