春豆装饰无歧义错误

时间:2019-07-10 08:14:04

标签: 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(){
        .
        .
        .
    }
}

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。

1 个答案:

答案 0 :(得分:-1)

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

@Configuration
public class MailFactoryConfiguration {

    @Bean
    @Lazy
    MailFactory baseMailFactory(){
        return new BaseMailFactory();
    }

    @Bean
    @Primary
    public MailFactory metricsAwareMailFactory(){
        return new MetricAwareMailFactory(baseMailFactory());
    }
}

通过这种方式,将创建两个bean,但是如果有多个实现,则将选择第一个bean。