java - Spring Java Config的继承使用不同的bean

标签 java spring

以下示例显示了使用 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/

相关文章:

java - 将图像上传到服务器(Java)

spring - Jersey中是否有类似于Spring的HandlerInterceptor的Interceptor

java - 使用 Stream API 对两个集合进行叉积

java - 使用 Sun 专有的 Java 类是一种不好的做法吗?

java - Spring 启动: Update Operation in New Thread

java - Spring Integration Java DSL SFTP如何在处理程序中获取远程SFTP服务器信息

java - 如果检测到更改,如何使 Maven 自动重新编译?

java - 您如何比较类别的顺序?

java - android 用相机拍摄多张图像

java.lang.NumberFormatException : For input string: "1538956627792"