gpt4 book ai didi

java - @ bean : unique bean name in subclasses

转载 作者:行者123 更新时间:2023-12-01 04:23:43 25 4
gpt4 key购买 nike

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

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

protected abstract B a();
}

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

本类 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,以注入(inject)其他 bean。换句话说,所有字段都应该有一个注入(inject)以下 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 的名称,这意味着即使我有超过 1 个 C 的扩展名,只有一个 bean 可用。在上面的示例中,这意味着 x , 或 y字段为空(或会引发异常)。

如何为这些 bean 赋予唯一的名称,以便 C 的所有扩展名可以不重叠地暴露自己的bean实例吗?

最佳答案

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

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

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

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

C父类(super class)

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

Spring 组件
@Component
public class Bean {
private final X x;
private final Y y;

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

希望这可以帮助

关于java - @ bean : unique bean name in subclasses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59755383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com