Java @Bean:子类中唯一的Bean名称
我在一个基于Spring4的项目中有一个抽象配置类。这个类看起来像这样: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
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;
}
}