春豆装饰没有歧义错误



我有以下场景:具有 2 个实现的工厂接口,而第二个用作第一个实现的装饰器。

public final class BaseMailFactory implements MailFactory {
@Autowired
private final ClassA classA;
@Autowired
private final ClassB classB;
public Mail createMail(){
.
.
.
}
}
public final class MetricAwareMailFactory implements MailFactory {
private final MailFactory mailFactory;
public Mail createMail(){
var mail = mailFactory.createMail();
return new MetricsAwareMail(mail);
}
}
@Configuration
public class MailFactoryConfiguration {
@Bean
public MailFactory metricsAwareMailFactory(){
return new MetricAwareMailFactory(???);
}
}

之前通过 spring 容器(上下文)实例化的包装对象,因此成功填充了所有自动连线字段。创建第二个实现后,我很难找到一种优雅的方式来初始化第一个实例,而无需向接口添加多个实现MailFactory这会导致由于歧义而导致应用程序启动错误。

我知道我可以使用资格,但它们污染了我的代码。

我正在寻找一种通过 spring 实例化类的方法,但没有实际将其注册为 bean,在较旧的 spring 版本中,我可以将匿名 bean 用于此类目的。

我发现@Primary注释在这里很有用:

@Configuration
public class MailFactoryConfiguration {
@Bean
@Lazy
MailFactory baseMailFactory(){
return new BaseMailFactory();
}
@Bean
@Primary
public MailFactory metricsAwareMailFactory(){
return new MetricAwareMailFactory(baseMailFactory());
}
}

这样,将创建两个 bean,但在多个实现的情况下将选择主要 bean。

相关内容

  • 没有找到相关文章

最新更新