【发布时间】:2015-12-22 21:23:19
【问题描述】:
以下示例显示了使用 spring java config 显式连接依赖项,这会导致在使用 spring 配置类的接口时连接不同的 bean。
这似乎不应该发生,或者至少给出正常警告,即有两个 bean 作为自动装配的候选者并且它不知道选择哪个。
对这个问题有什么想法吗?我的猜测是配置类之间没有真正的名称间距,正如语法“this.iConfig.a()”所暗示的那样,这是否可以被视为一个错误(如果只是为了不警告关于 2 个候选 bean)?
public class Main
{
public static void main( final String[] args )
{
final ApplicationContext context = new AnnotationConfigApplicationContext( IConfigImpl.class, ServiceConfig.class );
final Test test = context.getBean( Test.class );
System.out.println( test );
}
}
public class Test
{
private final String string;
public Test( final String param )
{
this.string = param;
}
public String toString()
{
return this.string;
}
}
@Configuration
public interface IConfig
{
@Bean
public String a();
}
@Configuration
public class IConfigImpl implements IConfig
{
@Bean
public String a()
{
return "GOOD String";
}
}
@Configuration
public class ServiceConfig
{
@Autowired
IConfig iConfig;
@Bean
Test test()
{
return new Test( this.iConfig.a() );
}
@Bean
String a()
{
return "BAD String";
}
}
在这种情况下,我希望“GOOD String”始终被连接到 Test 对象中,但是在上下文加载器中翻转 IConfigImpl.class、ServiceConfig.class 的顺序会改变加载哪个字符串。
使用 Spring 4.0.7 测试
编辑:进一步的测试表明这与固有配置无关。如果您删除 IConfig 接口,结果相同。
【问题讨论】: