Java @Bean:子类中唯一的Bean名称

Java @Bean:子类中唯一的Bean名称,java,spring,spring-boot,Java,Spring,Spring Boot,我在一个基于Spring4的项目中有一个抽象配置类。这个类看起来像这样: public abstract class C<B> { @Bean public B b() { return a(); } protected abstract B a(); } 目标是让每个扩展类按照预期的方式实例化和设置bean,并将实例作为Springbean公开以注入其他bean。换句话说,所有字段都应该在以下bean中注入一个bean实例: @C

我在一个基于Spring4的项目中有一个抽象配置类。这个类看起来像这样:

public abstract class C<B> {
    @Bean
    public B b() {
        return a();
    }

    protected abstract B a();
}
目标是让每个扩展类按照预期的方式实例化和设置bean,并将实例作为Springbean公开以注入其他bean。换句话说,所有字段都应该在以下bean中注入一个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()
创建的bean将始终具有
b
的名称,这意味着即使我有一个以上的
C
扩展,也只有一个bean可用。在上面的示例中,这意味着
x
y
字段为空(或将引发异常)


如何为这些bean指定唯一的名称,以便
C
的所有扩展都可以公开自己的bean实例而不重叠?

事实上,如果不指定bean名称,它将无法从以下消息开始:

在类路径资源中定义的bean“b”

这里有一种方法,这是违反直觉的,因为如果子类extender不调用
super.b()
,那么一些重要的逻辑将永远不会执行

但为了回答你的具体问题:

C超类

public abstract class C<B> {

  protected B b() {
   return a();
  }

  protected abstract B a();
}

希望这有帮助

我不希望重写
b()
,但是深入研究Spring代码似乎真的不可能替换命名
@Bean的机制
public abstract class C<B> {

  protected B b() {
   return a();
  }

  protected abstract B a();
}
@Configuration
public class E extends C<X> {

  @Bean("X)// Bean name qualifier
  @Override
  protected X b() {
    return super.b();
  }

  @Override
  protected X a() {
    return new X();
  }
}


@Configuration
public class F extends C<Y> {

  @Bean("Y") // Bean name qualifier
  @Override
  protected Y b() {
    return super.b();
  }

  @Override
  protected Y a() {
    return new Y();
  }
}
@Component
public class Bean {
  private final X x;
  private final Y y;

  public Bean(X x, Y y) {
    this.x = x;
    this.y = y;
  }
}