У меня есть абстрактный класс конфигурации в проекте на основе Spring 4. Класс выглядит примерно так:
public abstract class C<B> {
@Bean
public B b() {
return a();
}
protected abstract B a();
}
Конечно, это не настоящий класс, но давайте поработаем с этим теоретическим классом, который включает в себя наиболее важные части реального класса проблематики c.
Этот класс C
расширен несколькими классами. Например:
@Configuration
public class E extends C<X> {
@Override
protected X a() { return new X(); }
}
@Configuration
public class F extends C<Y> {
@Override
protected Y a() { return new Y(); }
}
Цель состоит в том, чтобы каждый расширяющий класс мог создавать экземпляры и настраивать bean-компонент так, как он должен быть, и представлять экземпляр как Spring-компонент для инъекции в другие bean-компоненты. Другими словами, все поля должны иметь экземпляр компонента, внедренный в следующий компонент:
@Component
public class Bean {
private final X x;
private final Y y;
public Bean(X x, Y y) {
this.x = x;
this.y = y;
}
}
Проблема состоит в том, что компонент, созданный b()
, всегда будет иметь имя b
, которое означает, что даже если у меня более 1 расширения C
, будет доступен только один из компонентов. В приведенном выше примере это будет означать, что поле x
или y
имеет значение null (или может вызвать исключение).
Как я могу дать уникальные имена этим бинам, чтобы все расширения C
могут предоставлять собственный экземпляр компонента без наложения?