Java 无歧义错误的springbean装饰

Java 无歧义错误的springbean装饰,java,spring,spring-boot,decorator,Java,Spring,Spring Boot,Decorator,我有以下场景:一个工厂接口有2个实现,而第二个用作第一个实现的装饰器 public final class BaseMailFactory implements MailFactory { @Autowired private final ClassA classA; @Autowired private final ClassB classB; public Mail createMail(){ . .

我有以下场景:一个工厂接口有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。

那么您不希望您的
BaseMailFactory
成为bean,但仍然在那里使用
@Autowired
注释?这将不起作用。我确实希望它将被初始化为bean,但不在bean注册表中注册。