【问题标题】:How to autowire an implementer with an specific profile in spring?如何在春季自动装配具有特定配置文件的实施者?
【发布时间】:2015-05-03 05:21:56
【问题描述】:

让我用代码演示一下:

public interface A {
  ....
}

@Profile({"V1"})
@Component
public class B implements A {
....
}

@Profile({"V2"})
@Component
public class C implements A {
....
}

我怎样才能动态地(在每个到达的请求上)让 spring 根据它们的配置文件自动装配上述类之一?连线的时候也可以做这样的事情吗?

背景:我正在寻求一种实现服务器端版本控制机制的良好实践。如果请求属于版本“V1”,我想用“V1”配置文件自动装配一个类,反之亦然。 (目前我正在自动装配一个列表并对其进行迭代以找到合适的版本)。

【问题讨论】:

  • 不,这是不可能的。 spring bean 是在服务器启动时创建的。您将需要重新考虑您的实施。

标签: java spring autowired spring-profiles


【解决方案1】:

甚至可以在每个请求中自动装配 bean 吗?

不,这是不可能的。创建上下文时注入 Bean。

我正在寻求一种实现服务器端版本控制机制的好习惯

你可以关注这个答案How to manage REST API versioning with spring?

【讨论】:

    【解决方案2】:

    答案是否定的,因为当您尝试在 spring 中激活多个配置文件时,例如 -Dspring.profiles.active=profile1,profile2,并且两个配置文件都包含 implements A 的 bean,那么 spring 将使用 implements A 的 bean 的最后一个活动定义,即 B在你的情况下。

    【讨论】:

    • 如果找到两个bean,则抛出NoUniqueBeanDefinitionException
    • BeanFactory 被要求提供一个 bean 实例时抛出它,当只需要一个匹配的 bean 时,它已经找到了多个匹配的候选者。
    • 是的,当两个配置文件都处于活动状态时(会找到多个候选人),情况正是如此。当然,如果注入点是一个集合,两个实例都会被注入到集合中,否则会抛出上述异常。
    【解决方案3】:
    public interface A {
      ....
    }
    
    @Profile({"V1"})
    @Service("bean1")
    public class B implements A {
    ....
    }
    
    @Profile({"V2"})
    @Service("bean2")
    public class C implements A {
    ....
    }
    

    现在是第三课:

    class D {
    @Autowired
    @Qualifier("bean1")
    private A a;
    
    }
    

    希望能帮到你

    【讨论】:

    • 这没有回答问题。 @MoienGK 希望根据请求负载加载不同的 bean。
    • 我认为这个问题没有解决方案
    【解决方案4】:

    你使用@Qualifier注解来注入上面的接口

    【讨论】:

    • 谢谢。您可以在答案中添加代码示例吗?
    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 2017-12-13
    • 2015-12-11
    • 2013-04-26
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多