以下示例显示了使用 spring java config 显式连接依赖项,这会导致在使用 spring 配置类的接口(interface)时连接不同的 bean。
这似乎不应该发生,或者至少给出正常的警告,即有两个 bean 作为 Autowiring 的候选者,并且它不知道选择哪个。
对这个问题有什么想法吗?我的猜测是,配置类之间没有真实的名称间距,正如语法“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";
}
}
在这种情况下,我希望始终在 Test 对象中连接“GOOD String”,但翻转上下文加载器中 IConfigImpl.class、ServiceConfig.class 的顺序会更改加载的字符串。
使用 Spring 4.0.7 进行测试
编辑:进一步测试表明这与固有配置无关。如果您删除 IConfig 接口(interface),也会产生同样的结果。
最佳答案
我相信这是 Spring 多年来的行为。
如果您重新定义一个 Bean,则最后加载的 Bean 将获胜。
另一个问题是使用java配置时如何控制bean加载的顺序。看看这篇文章http://www.java-allandsundry.com/2013/04/spring-beans-with-same-name-and.html它向您展示了如何使用其他 Spring java 配置的 @Import
进行排序。
The solution is actually simple - if you need to override a previously defined bean(without say the flexibility of autowiring with a different bean name), either use the XML bean configuration for both the bean being overridden and the overriding bean or use the @Configuration. XML bean configuration is the first example in this entry, the one with @Configuration would be something like this:
@Configuration
public class Context1JavaConfig {
@Bean
public MemberService memberService() {
return new MemberSvcImpl1();
}
}
@Configuration
@Import(Context1JavaConfig.class)
public class Context2JavaConfig {
@Bean
public MemberService memberService() {
return new MemberSvcImpl2();
}
}
关于java - Spring Java Config的继承使用不同的bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34424635/