Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导:依赖项注入取决于配置(和使用接口)_Java_Spring_Spring Boot_Kotlin_Architecture - Fatal编程技术网

Java Spring引导:依赖项注入取决于配置(和使用接口)

Java Spring引导:依赖项注入取决于配置(和使用接口),java,spring,spring-boot,kotlin,architecture,Java,Spring,Spring Boot,Kotlin,Architecture,关于我的应用程序架构的结构,我有以下问题。 假设我的应用程序由以下组件组成 首先是一个@ConfigurationProperties,它初始化了我所需的属性(这里只提供了一个选择提供者的类型)。 此外,根据指定的类型,此时将注册类型为“Provider”的bean。此类型实现为一个接口,在本例中有两个具体实现(ProviderImplA和ProviderImplB) @配置 @简介(“供应商”) @配置属性(前缀=“提供程序”) @ConditionalOnProperty(prefix=“p

关于我的应用程序架构的结构,我有以下问题。 假设我的应用程序由以下组件组成

首先是一个@ConfigurationProperties,它初始化了我所需的属性(这里只提供了一个选择提供者的类型)。 此外,根据指定的类型,此时将注册类型为“Provider”的bean。此类型实现为一个接口,在本例中有两个具体实现(ProviderImplA和ProviderImplB

@配置
@简介(“供应商”)
@配置属性(前缀=“提供程序”)
@ConditionalOnProperty(prefix=“provider”,name=[“type”])
类提供程序配置{
lateinit变量类型:String
@Bean(名称=[“提供程序”])
乐趣提供者():提供者{
返回时间(类型){
“providerA”->ProviderImplA()
“providerB”->ProviderImplB()
}
}
}
接下来,只有两个接口的具体实现

class ProviderImplA:提供程序{
@自动连线
lateinit var serviceA:serviceA
}
class ProviderImplB:提供程序{
@自动连线
lateinit var serviceA:serviceA
@自动连线
lateinit var serviceB:serviceB
@自动连线
lateinit var serviceC:serviceC
}
最后但并非最不重要的是接口本身

接口提供程序{
有趣的事
}
现在来看看实际问题,或者更好我的问题:

因为我的具体实现(ProviderImplA和ProviderImplB)没有有效的定义bean(缺少注释,例如@Component),但它们必须使用自己的@Service组件,所以此时不可能使用@Autworie。如果可能的话,我希望避免使用不同的配置文件/配置,因此按属性初始化。如何在我的实现中仍然使用单个@Service,并且仍然根据配置手动创建提供者bean(运行时只存在一个提供者)?也许您还有其他建议或改进?

当直接实例化对象时,spring无法控制其生命周期,因此您必须为每个“提供者”创建一个@Bean

@Bean(name = ["providerA"])
@Lazy
fun providerA(): Provider {
  return ProviderImplA()
}

@Bean(name = ["providerB"])
@Lazy
fun providerB(): Provider {
   return ProviderImplB()
}
IdentityProviderConfiguration类

IdentityProviderConfiguration {
  var context: ApplicationContext
  ...

  fun provider(): Provider {
    return when (type) {
     "providerA" -> context.getBean("providerA")
     "providerB" -> context.getBean("providerB")
    }
  }

}

当直接实例化对象时,spring无法控制其生命周期,因此必须为每个“提供者”创建一个@Bean

@Bean(name = ["providerA"])
@Lazy
fun providerA(): Provider {
  return ProviderImplA()
}

@Bean(name = ["providerB"])
@Lazy
fun providerB(): Provider {
   return ProviderImplB()
}
IdentityProviderConfiguration类

IdentityProviderConfiguration {
  var context: ApplicationContext
  ...

  fun provider(): Provider {
    return when (type) {
     "providerA" -> context.getBean("providerA")
     "providerB" -> context.getBean("providerB")
    }
  }

}

但问题是,同一时间只能存在一个提供程序,这个提供程序应该可以通过配置从外部选择。我调整了示例好的,谢谢。但是我如何解决我的实现必须使用/依赖于其他bean/配置的情况呢?当我们研究上下文时,spring会处理依赖关系树。所以我可以在实现类中保留@Autowired注释?但问题是,同时只能存在一个提供程序,并且这个提供程序应该可以通过配置从外部选择。我调整了示例OK,谢谢。但是我如何解决我的实现必须使用/依赖于其他bean/配置的情况呢?当我们研究上下文时,spring会处理依赖关系树。所以我可以在实现类中保留@Autowired注释?