【问题标题】:Spring instantiate prototype beans by manual callSpring通过手动调用实例化原型bean
【发布时间】:2023-03-05 18:34:01
【问题描述】:

我有一个 @Configuration 类,我尝试使用它来自定义我的应用程序的 JMS 组件的配置。这是简化的代码:

@Configuration
class JmsConfiguration(
    val props: JmsProperties
) : JmsListenerConfigurer {
    @Bean
    fun connectionFactoryManager(): ConnectionFactoryManager {
        return ConnectionFactoryManager(props.services.map { serviceProps ->
            connectionFactory(serviceProps)
        }.toList())
    }

    @Bean
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    fun connectionFactory(serviceProps: JmsServiceProps): ConnectionFactory {
        val cf = MQConnectionFactory()
        // some configuration
        return cf
    }

    override fun configureJmsListeners(registrar: JmsListenerEnpointRegistrar) {
        // adding custom message listeners to registrar
    } 
}

问题是 Spring 抱怨 connectionFactory 方法,它的参数 serviceProps 说如下:“JmsConfiguration 中的方法 connectionFactory 的参数 0 需要一个无法找到的 JmsServiceProps 类型的 bean”这很奇怪。我以为spring不会为prototype作用域bean工厂方法查找参数?如果不是这种情况,我不知道应该如何创建这样的实例?

注意:我需要这些连接工厂出现在 spring 上下文中,因为它们之后会被其他组件包装。

【问题讨论】:

  • 我猜@Configuration @EnableConfigurationProperties(JmsServiceProps.class)?
  • @Eugene 是的,你是对的,我只是错过了,问题不在于我的属性没有被读取。 Spring 出于某种原因试图在我手动调用此方法时在上下文中找到 serviceProps

标签: java spring kotlin dependency-injection


【解决方案1】:

除非属性文件是@Bean,否则你需要告诉Spring。最简单的方法是:

@Configuration 
@EnableConfigurationProperties(JmsServiceProps.class)

【讨论】:

  • 是的,你说得对,我只是错过了,问题不在于我的属性没有被读取。 Spring 出于某种原因试图在我手动调用此方法时在上下文中查找 serviceProps
  • 我刚刚回答了您关于“JmsConfiguration 中方法 connectionFactory 的参数 0 需要 JmsServiceProps 类型的 bean”的问题。您目前有一个不同的问题吗?是您所说的吗?
  • 不,我的意思是我从connectionFactoryManager 中调用connectionFactory 并手动为此原型作用域方法提供参数。为什么 spring 会尝试自动为其查找参数,这是它对原型 bean 的工作方式吗?
  • @mr.nothing 我猜对于 Spring,serviceProps 你传递的不是 bean,因为消息说:“需要 JmsServiceProps 类型的 a bean”。你从哪里得到“我认为 spring 不会为原型范围的 bean 工厂方法查找参数?”这部分?这是记录在案的吗?
  • 但是否则这没有任何意义。那么PROTOTYPE 作用域的用例是什么? AFAIU 被特别引入以在 bean 实例化期间进行某种类型的参数化。
猜你喜欢
  • 2016-06-08
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多