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

如何在SpringBoot中为不同的属性值使用构造函数注入创建相同的Bean

陶成化
2023-03-14

我必须为要使用构造函数注入的不同属性值创建多个相同类型的bean。

目前我已经使用Bean范围作为原型

    package com.demo.service;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.env.Environment;

    @Configuration
    public class ConfigClass {


@Bean(name="RC")
public JavaClient getClient(@Autowired Environment env)
{
    String sName=env.getProperty("RCSName");
    String aUrl=env.getProperty("RCAUrl");
    String dUrl=env.getProperty("RCDUrl");
    return new JavaClient(sName,aUrl,dUrl);
}

@Bean(name="O")
public JavaClient getOClient(@Autowired Environment env)
{
    String sName=env.getProperty("OSName");
    String aUrl=env.getProperty("OAUrl");
    String dUrl=env.getProperty("ODUrl");
    return new JavaClient(sName,aUrl,dUrl);
}

}

现在它正在按照上面的代码创建2个bean。期望:如何组合getClient

共有1个答案

易淳
2023-03-14

我已经修改了我的配置类如下

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Scope;
    import org.springframework.scheduling.annotation.EnableScheduling;


    @Configuration
    @EnableScheduling
    public class ConfigClass {

        @Bean
        @Scope("prototype")
        public JavaClient getClient(String sName,String aUrl,String dUrl)
        {
            return new JavaClient(sName,aUrl,dUrl);
        }
    }

然后创建ApplicationContextAware来创建bean。

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Iterator;
import java.util.List;

import javax.annotation.PostConstruct;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;



@Component
public class ApplicationContextProvider implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;

    } 

    public ApplicationContext getContext() {
        return applicationContext;
    }

    @PostConstruct
    public void init()
    {
        try {
            String fileName = "Url.txt";
               Resource resource = new ClassPathResource(fileName);
               File file = resource.getFile();

               List<String> lines = Files.readAllLines(file.toPath());

                for (Iterator<String> iterator = lines.iterator(); iterator.hasNext();) {
                    String line = (String) iterator.next();
                    String[] s = line.split(",");
                    applicationContext.getBean(JavaClient.class,s[0], s[1], s[2]);

                }
            } catch (IOException e) {
                e.printStackTrace();
        }
    }

}
 类似资料:
  • 问题内容: 所以我有这个示例数据框: 现在我想将这些功能和列获得新列。 就像函数使用列和范围作为创建列的输入一样,类似地,列和范围也用于列: 我可以使用这一种衬管一个接一个地创建每个列,但是我想一次用一个衬管将其应用于两个列。 结果数据帧应如下所示: 我想一次创建这些列,而不是一次创建一列。我怎样才能做到这一点?有什么建议?或类似的东西可以工作? 问题答案: 这是您需要遵循的概念才能实现这一目标。

  • 我知道这应该是小菜一碟,但我就是一事无成。 在我的spring boot应用程序中,application.yml文件中,我有这样一个条目: 我有一个spring服务(这是假的,但证明了问题): 但启动失败: org.springframework.beans.factory.beanCreationException:创建文件[...(类文件)...]中定义的名为“dummy service”的

  • 假设我有一个表'some-table',我想在多个模式中创建它。名为“create-some-table.yaml”的文件 最后一个是changelog-master,它非常简单 有什么办法我可以做类似这样的事情吗,谢谢:)

  • 问题内容: 我的spring bean具有一个带有唯一强制性参数的构造函数,我设法用xml配置对其进行了初始化: 然后,我像这样使用此bean,并且效果很好。 但是我想用注释指定contructor arg值,例如 这可能吗 ? 提前致谢 问题答案: 首先,必须在bean定义中而不是在注入点中指定构造函数arg。然后,你可以利用spring的注释(spring 3.0) 就我所看到的问题而言,这可

  • 我不太清楚kotlin是如何管理属性名和主构造函数参数名的。如果我写了相同的属性名和参数名,那么kotlin编译器会给出一个错误。 它给出了这个错误。 但是,当我更改属性的名称或更改主构造函数的参数名称时,代码将工作并编译。 这将工作或编译罚款。 这背后的原因是什么?为什么主构造函数的参数名和属性名不能相同?

  • 假设一个对象有10个实例,其中有一些字段。其中一个字段指定ID。另外两个字段包含有关位置(纬度和经度)的数据。一个字段包含日期时间信息。 在这10个例子中,ID保持不变,但与日期、时间和位置相关的字段发生了变化。 上述数据是虚拟数据。但你可以观察到id保持不变,只是位置和时间发生了变化。 使用java, sping-data-elasticsearch我能够把信息在弹性搜索。 我面临的问题是,在弹