java - 正确使用 BeanFactory 按名称、类型和构造函数参数检索 bean

标签 java spring spring-boot

我有许多原型(prototype) bean,它们都共享一个公共(public)父类(super class) ( Foo )。所有这些 bean 都有一个采用一个 String 参数的通用构造函数。

我想根据完全限定的 bean 名称和 String 构造函数参数以编程方式检索(并创建)这些 bean。 因为这个 bean 名称来自(外部)配置,所以我需要确保只有公共(public)父类(super class) Foo 的 bean可以这样构建

想象一下以下情况:

  • 界面Foo
  • bean A implements Foo
  • bean B implements Foo
  • bean C implements Bar

我现在需要一个方法来执行此操作:

public Foo getBean(String name, String arg) {
    // Create a new instance of A or B (but not C) depending on name.
    // Pass args as the constructor argument
}

我已经尝试排除以下内容:

  • BeanFactory#getBean(String name, Object... args)太笼统了。允许创建匹配的任何 bean,而不是类型 Foo .
  • BeanFactory#getBean(String name, Class<T> requiredType) 。无法传递构造函数参数
  • ObjectProvider<Foo>#getObject(Object... args) 。多个 bean 匹配。无法选择AB按名字

看来我需要的是类似 BeanFactory#getBean(String name, Class<T> requiredType, Object... args) 的东西但这似乎不存在。

最佳答案

我已经创建了一些可行的东西,但我仍然希望有一个更好、更干净的解决方案可用:

    public Foo getFoo(String name, String arg) {
        if (beanFactory.containsBean(name) && beanFactory.isTypeMatch(name, Foo.class)) {
            return (Foo) beanFactory.getBean(name, arg);
        }
        throw new RuntimeException("nope!");
    }

关于java - 正确使用 BeanFactory 按名称、类型和构造函数参数检索 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60619789/

相关文章:

java - 通过 SSL 保护 Tomcat/Axis2 Web 服务的问题

具有所有请求参数的 Java REST API - 最佳实践

java - 当消息数大于并发消费者数时,如何消费 Spring IntegrationFlow 中所需的所有消息?

spring - Spring 和 Spring Boot 的区别

java - BIRT 3.7 运行时。不能再自定义 PDF 字体和 jdbc 驱动程序了吗?

java - JTree 如何响应已更改的 DefaultMutableTreeNode?

java - 通过反射从外部包类中设置包私有(private)类的私有(private)字段

java - 如何使用 Websphere Liberty Profile 8.5 中定义的数据源?

java.lang.ClassCircularityError : java/util/logging/LogRecord from Tomcat8 错误

spring - 使用 Spring Boot 的 SPA - 为非 API 请求提供 index.html