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

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

唐经国
2023-03-14

我似乎遇到了这个问题,当我使用注释为某些类配置依赖注入时,以及通过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实例,因为在通过xml配置的类访问它时,对SuperBean对象所做的更改没有反映出来。

那么,我如何确保这里只有一个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个答案

傅朝
2023-03-14

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

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

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

<constructor-arg index="1" ref="SuperBean"/>
 类似资料:
  • 我试图不去增加很复杂的结构代码,保持简洁可测试性的代码和好的实践,我想我应该用Kotlin从其它方面去简化代码。如果你想了解一些控制反转或者依赖注入的话题,你可以查看我关于Android中使用Dagger注入的一系列文章。第一篇文章有关于他们这个团队的简单描写。 一种简单的方式,如果我们想拥有一些独立于其他类的类,这样更容易测试,并编写代码,易于扩展和维护,这时我们需要使用依赖注入。我们不去在类内

  • 我只是从喷气背包和剑柄开始。但是当我注入到ViewModel中时,我遇到了一些问题。 我得到的错误: 我可以在活动中注入所有细节,但不能在ViewModel中注入。我已经尝试了所有我能找到的解决办法。 我的gradle文件: 项目根级别: 模块级: 我的申请文件 我的模块文件: 项目是具有可组合屏幕的单个活动,因此主要活动: 视图模型: 我尝试过的事情: 改为ViewModelComponent而

  • 1. 前言 上一节,我们通过 xml 文件的配置方式,实现了对多种依赖类型的注入,当然体会到了 xml 文件配置方式的弊端:有一点麻烦。 依赖注入是有两种方式,一种是 xml ,另外一种就是注解的配置方式。 本节,我们演示下通过注解配置这种方式来实现注入依赖。 来吧 ,直入主题,莫浪费大好光阴… 2. 工程实例 2.1 注解的介绍 在正式使用注解之前,我们首先介绍下注解语法以及它的作用。 @Aut

  • 1. 前言 本小节目的在于带领大家学习xml 文件配置,应用 xml 文件配置 IoC。 在第二节中我们通过一个入门工程简单的体验了一把 Spring 的使用。在第三节中梳理了一下 Spring 的工作流程。 可能大家有了一个初步认知,Spring 框架的工作脱离不了核心配置文件 applicationContext.xml。 在配置文件中我们目前只用到了一个 bean 标签,而它的作用大家也明白

  • 我有一个集成了spring框架的maven项目,我使用这个项目为移动应用程序构建web服务。当我在AWS ubuntu服务器上部署该项目时,该项目给出了BeanCreationException并且它在Tomcat7上运行失败。当我在本地环境中运行它时,它工作得很好。下面是Tomcat7的错误日志。 TIA

  • 所以我正在尝试学习spring,我已经读了很多教程,并且尝试从闪存驱动器中的一个项目中复制一些代码。 我已经设置了tomcat,它的工作发现,但我仍然有一些问题在这里。问题是,我通常可以毫无问题地从浏览器访问控制器的操作,但当我开始添加注释和ContextLoaderListener时,它一直给我404的状态。我不知道我做了什么,但通过调整一些事情,我的浏览器至少尝试再次到达控制器。但会抛出一个巨