如何分割Spring条件配置?
How to split Spring Conditional configuration?
我的应用程序使用它自己的 Spring 配置 Condition
来根据设置提供 bean,但是由于数量的原因,我希望分割长 @Configuration
而不是添加 @Conditional
到几十豆。
目前,我的主要安全配置如下所示
@Configuration @EnableOAuth2Client @EnableWebSecurity
@Import(OptionalAuthenticationConfiguration.class)
public class WebshopSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired(required = false)
private OptionalAuthenticationConfiguration auth;
这里是条件配置
@Configuration
@Conditional(MyCondition.class)
public class OptionalAuthenticationConfiguration {
[...]
由于 @Conditional
可选配置,@Import
注释失败
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webshopSecurityConfig': Injection of autowired dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Could not autowire field: private OptionalAuthenticationConfiguration
WebshopSecurityConfig.auth; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [OptionalAuthenticationConfiguration] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
即使 bean 属性 WebshopSecurityConfig.auth
有 required = false
.
有没有办法在 Spring 中实现这种条件配置拆分?
使 OptionalAuthenticationConfiguration
具有两个实现的接口。
@Conditional(MyCondition.class)
的实际实现和 @ConditionalOnMissingBean
的空实现。
这样当 MyCondition
不允许创建配置时,它将被占位符空实现替换。
我在这个问题中描述的内容预计会起作用...就 "MyCondition" 而言 returns 正确,我的问题就在那里。
项目上下文比这里显示的要复杂得多:"OptionalAuthenticationConfiguration" 实际上是一个 Spring 安全 SAML 设置,需要来自 "WebSecurityConfigurerAdapter" 的许多 bean。
因此,我的代码在这两个配置之间以循环“@Import”结尾。我不得不将 5 个 bean 从 "OptionalAuthenticationConfiguration" 移动到 "WebshopSecurityConfig" 并使它们中的每一个都成为“@Conditional”。
我的应用程序使用它自己的 Spring 配置 Condition
来根据设置提供 bean,但是由于数量的原因,我希望分割长 @Configuration
而不是添加 @Conditional
到几十豆。
目前,我的主要安全配置如下所示
@Configuration @EnableOAuth2Client @EnableWebSecurity
@Import(OptionalAuthenticationConfiguration.class)
public class WebshopSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired(required = false)
private OptionalAuthenticationConfiguration auth;
这里是条件配置
@Configuration
@Conditional(MyCondition.class)
public class OptionalAuthenticationConfiguration {
[...]
由于 @Conditional
可选配置,@Import
注释失败
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webshopSecurityConfig': Injection of autowired dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Could not autowire field: private OptionalAuthenticationConfiguration
WebshopSecurityConfig.auth; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [OptionalAuthenticationConfiguration] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
即使 bean 属性 WebshopSecurityConfig.auth
有 required = false
.
有没有办法在 Spring 中实现这种条件配置拆分?
使 OptionalAuthenticationConfiguration
具有两个实现的接口。
@Conditional(MyCondition.class)
的实际实现和 @ConditionalOnMissingBean
的空实现。
这样当 MyCondition
不允许创建配置时,它将被占位符空实现替换。
我在这个问题中描述的内容预计会起作用...就 "MyCondition" 而言 returns 正确,我的问题就在那里。
项目上下文比这里显示的要复杂得多:"OptionalAuthenticationConfiguration" 实际上是一个 Spring 安全 SAML 设置,需要来自 "WebSecurityConfigurerAdapter" 的许多 bean。
因此,我的代码在这两个配置之间以循环“@Import”结尾。我不得不将 5 个 bean 从 "OptionalAuthenticationConfiguration" 移动到 "WebshopSecurityConfig" 并使它们中的每一个都成为“@Conditional”。