【问题标题】:@Bean: unique bean name in subclasses@Bean:子类中唯一的 bean 名称
【发布时间】:2020-01-15 16:10:44
【问题描述】:

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

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

    protected abstract B a();
}

当然,这不是真正的课程,但是让我们来学习这个理论课程,它涉及真正问题课程中最重要的部分。

这个类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,以注入其他 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 可用。在上面的示例中,这意味着 xy 字段为空(或将引发异常)。

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

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    确实,如果不指定 bean 名称,它将无法以以下消息开头:

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

    这是一种反直觉的方法,因为如果子类扩展器不调用super.b(),那么某些重要的逻辑将永远不会被执行。

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

    C 超类

    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;
      }
    }
    

    希望对你有帮助

    【讨论】:

    • 我宁愿不覆盖b(),但深入研究Spring代码似乎真的不可能替换名称为@Beans的机制
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多