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

带有运行时构造函数参数的 Spring Bean [复制]

秦天宇
2023-03-14

我想在SpringJava配置中创建一个Springbean,并在运行时传递一些构造函数参数。我创建了以下Java配置,其中有一个beanfixedLengthReport,它需要构造函数中的一些参数。

@Configuration
public class AppConfig {

    @Autowrire
    Dao dao;

    @Bean
    @Scope(value = "prototype")
    **//SourceSystem can change at runtime**
    public FixedLengthReport fixedLengthReport(String sourceSystem) {
         return new TdctFixedLengthReport(sourceSystem, dao);
    }
}

但是我得到一个错误,sourceSystem无法连接,因为没有找到bean。如何用运行时构造函数参数创建bean?

我正在使用Spring 4.2

共有3个答案

冯星阑
2023-03-14

你的代码看起来不错,要获得带有参数的原型,请使用 BeanFactory#getBean(字符串名称,对象...参数)方法。

看看Spring Java Config:如何用运行时参数创建原型作用域的@Bean?BeanFactory#getBean(字符串名称,对象...args)将是你正在寻找的。

我猜你的想法(在我的例子中是IntelliJ IDEA第15版。)给你错误,它不是运行时/编译时错误。

在IntelliJ中,您可以更改Spring检查的设置。

  • 转到文件 -
汝楷
2023-03-14

这可以通过Spring的ObjectSetder来实现

要点是为要提供的对象定义bean工厂方法,注入<code>ObjectProvider

public class Pair
{
    private String left;
    private String right;

    public Pair(String left, String right)
    {
        this.left = left;
        this.right = right;
    }

    public String getLeft()
    {
        return left;
    }

    public String getRight()
    {
        return right;
    }
}

@Configuration
public class MyConfig
{
    @Bean
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    public Pair pair(String left, String right)
    {
        return new Pair(left, right);
    }
}

@Component
public class MyConsumer
{
    private ObjectProvider<Pair> pairProvider;

    @Autowired
    public MyConsumer(ObjectProvider<Pair> pairProvider)
    {
        this.pairProvider = pairProvider;
    }

    public void doSomethingWithPairs()
    {
        Pair pairOne = pairProvider.getObject("a", "b");
        Pair pairTwo = pairProvider.getObject("z", "x");
    }
}

注意:您实际上没有实现< code>ObjectProvider

邢乐
2023-03-14

您可以将原型 Bean 与 BeanFactory 一起使用。

@Configuration
public class AppConfig {

   @Autowired
   Dao dao;

   @Bean
   @Scope(value = "prototype")
   public FixedLengthReport fixedLengthReport(String sourceSystem) {
       return new TdctFixedLengthReport(sourceSystem, dao);
   }
}

@Scope(value = “prototype”)意味着 Spring 不会在开始时实例化 bean,而是稍后按需实例化。现在,要自定义原型 Bean 的实例,您必须执行以下操作。

@Controller
public class ExampleController{

   @Autowired
   private BeanFactory beanFactory;

   @RequestMapping("/")
   public String exampleMethod(){
      TdctFixedLengthReport report = 
         beanFactory.getBean(TdctFixedLengthReport.class, "sourceSystem");
   }
}

注意,因为您的bean不能在启动时被实例化,所以您不能直接自动连接您的bean;否则Spring会尝试实例化bean本身。这种用法会导致错误。

@Controller
public class ExampleController{

   //next declaration will cause ERROR
   @Autowired
   private TdctFixedLengthReport report;

}
 类似资料:
  • 问题内容: 我想在 Spring Java配置中 创建一个Spring bean,并在运行时传递一些构造函数参数。我创建了以下Java配置,其中有一个bean fixedLengthReport ,它在构造函数中需要一些参数。 但是我收到错误消息, 表明 未找到bean 导致 sourceSystem 无法连接。如何使用运行时构造函数参数创建bean? 我正在使用Spring 4.2 问题答案:

  • 我使用的是jdk8,需要创建一个以类名作为构造函数参数的Spring组件。但是,使用我当前的代码,我遇到了运行时错误: 这是我的博客类: 这就是我尝试创建类的方式: 我可以了解一下创建该组件的正确方法/这里出了什么问题吗?提前感谢。

  • 我有以下代码: 我不希望字段ui有一个getter,但是kotlin在默认情况下会生成它,因为它是构造函数中定义的val。 在properties and fields文档中,我发现我可以用以下代码生成一个私有getter 但我在构造函数定义中找不到这样做的方法

  • 当Java中给出参数构造函数时,为什么默认的无参数构造函数会失败? 这个设计有什么意义? 例如:

  • 主要内容:默认拷贝构造函数拷贝和复制是一个意思,对应的英文单词都是 。 对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将 Word 文档拷贝到U盘去复印店打印,将 D 盘的图片拷贝到桌面以方便浏览,将重要的文件上传到百度网盘以防止丢失等,都是「创建一份新数据」的意思。 在 C++ 中,拷贝并没有脱离它本来的含义,只是将这个含义进行了“特化”,是指用已经存在的对

  • 我正在尝试使用recyclerview和room库创建一个简单的ToDoList应用程序。在使用room和mvvm架构方面,我正在遵循android开发者代码实验室,我似乎遇到了困难。我已经设置了应用程序的每一层,但在尝试使用ViewModelProvider实例化ViewModel时出现了一个错误。下面是我的ViewModel类中的代码。 } 下面是我试图初始化ViewModel的main片段中