Несколько бинов с одинаковой реализацией при загрузке Spring - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть ситуация, когда я использую одну возможную реализацию для конкретного компонента, и это выглядит так:

@Configuration
public class MyConfig {

    @Autowired
    private ApplicationContext context;

    @Bean
    public SomeInterface someInterface() {
        if (this.context.getEnvironment().getProperty("implementation") != null) {
            return new ImplementationOne();
        } else {
            return new ImplementationTwo();
        }
    }
}

До сих пор это работало замечательно, пока не появилось новое требование для использованиядополнительный интерфейс, который на данный момент обеспечивает реализацию только ImplementationTwo, и не имеет смысла использовать его с ImplementationOne:

    @Bean
    public SomeOtherInterface someOtherInterface() {
            return new ImplementationTwo();
    }

Я думаю, это будет работать, но мне интересно,это действительно имеет смысл, потому что в одном сценарии у меня могут быть оба компонента, в основном, создающие один и тот же объект.Имеет ли это смысл ?Может быть, есть лучший способ добиться того же?

1 Ответ

0 голосов
/ 14 ноября 2018

Полагаю, если у вас есть несколько реализаций одного интерфейса, тогда вам следует обратиться к конкретным именам компонентов, как показано ниже.

Здесь реализация1 будет основным компонентом, созданным и внедренным везде, где у нас есть зависимость Интерфейса1.

@Primary
@Bean
public Interface1 implementation1() {
    return new Implementation2();
}

@Bean
public Interface1 implementation2() {
    return new Implementation2();
}

Если нам нужно внедрить внедрение2, нам нужна аннотация @Resource, как показано ниже.

@Resource(name="implementation2")
Interface1 implementation2;
...