【问题标题】:Create a bean at runtime with generic在运行时使用泛型创建一个 bean
【发布时间】:2022-07-28 18:58:58
【问题描述】:

我需要以编程方式为 spring 数据创建一个 spring bean。它管理一个只在运行时知道的泛型类。 这是我的存储库定义:

@Component
public interface GeneratorRepository<P extends MyType>
        extends Repository<P, Long>

这就是我创建 bean 的方式:

@Autowired
DefaultListableBeanFactory springContextBeanFactory;
RootBeanDefinition beanDefinition = new RootBeanDefinition(GeneratorRepository.class);
        beanDefinition.setTargetType(
                ResolvableType.forClassWithGenerics(GeneratorRepository.class, aMyTypeClassImpl));
        
springContextBeanFactory.registerBeanDefinition(
        aMyTypeClassImpl.getSimpleName() + GeneratorRepository.class.getSimpleName(), beanDefinition);

之后,我可以使用类似这样的方式获取 bean 名称:

String[] name = springContextBeanFactory.getBeanNamesForType(
                        ResolvableType.forClassWithGenerics(GeneratorRepository.class, aMyTypeClassImpl));

我得到了刚刚创建的 bean 的名称。但是我在做的时候得到 BeanCreationException :

springContextBeanFactory.getBean(beanNamesForType[0])

带有消息: 无法实例化 [com.my.project.generator.GeneratorRepository]:指定的类是一个接口

问题是:是否可以以编程方式为具有泛型的接口创建 bean 并使用它来获取对象?

感谢您的阅读和任何帮助!

【问题讨论】:

    标签: spring generics


    【解决方案1】:

    不,您不能创建接口实例。但是您可以在运行时创建它的实现(参见 ByteBuddy),然后将其作为 bean 添加到 spring。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      相关资源
      最近更新 更多