我有以下情况:一个带有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。
答案 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。