java - 带有重复bean和@Order注释的Spring依赖注入(inject)

标签 java spring dependency-injection spring-bean

当有多个具有相同名称/类型的 bean 时,我对 Spring 中的 DI 注入(inject)机制感到相当困惑。 根据 Pivotal 的“Core Spring”类(class)的考试幻灯片,Spring 对相同 bean 的行为可以归结为:

  • 一个人可以多次定义同一个 bean
  • Spring 注入(inject)最后定义的 bean
  • 使用@Order,可以修改加载机制(以及最后加载哪个bean)

但是,在下面的示例中,Spring 将忽略任何 @Order 注释,并从 @Import 语句中最后提到的 Config 类注入(inject) bean。 因此,我想知道 @Import 注释中配置类的顺序是否会覆盖任何 @Order 注释。或者我错过了另一个重要的点? 任何提示都将受到高度赞赏。感谢堆栈溢出!

主配置类

@Configuration
@Import({RogueConfig.class,RewardsConfig.class})
public class TestInfrastructureConfig {
  // nothing interesting here, just importing configs
}

奖励配置

@Configuration
@Order(1)
public class RewardsConfig {
    @Bean
    public RewardNetwork rewardNetwork() {
        System.out.println("This Bean has been loaded from: " + this.getClass().getName());
        return new RewardNetworkImpl(null, null, null);
    }
}

RogueConfig

@Configuration
@Order(2)
public class RogueConfig {
    @Bean
    public RewardNetwork rewardNetwork() {
        System.out.println("This Bean has been loaded from: " + this.getClass().getName());
        return new RewardNetworkImpl(null, null, null);
    }
}

测试类

public class RewardNetworkTests {

    ApplicationContext applicationContext;

    @BeforeEach
    void setUp() {
        applicationContext = SpringApplication.run(TestInfrastructureConfig.class);
    }

    @Test
    void injectingRewardNetworkBeanWithOrdering() {
        RewardNetwork rewardNetwork = applicationContext.getBean(RewardNetwork.class);
        assertNotNull(rewardNetwork);
    }
}

无论我分配什么值@Order,或者如果我使用排序,结果将始终是:

此 Bean 已从以下位置加载:config.RewardsConfig$$EnhancerBySpringCGLIB$$62461c55

更改此设置的唯一方法是修改我的 TestInfrastructureConfig 中的导入注释,如下所示:

@Import({RewardsConfig.class,RogueConfig.class}),产生:

此 Bean 已从以下位置加载:config.RogueConfig$$EnhancerBySpringCGLIB$$6ca7bc89

我想知道需要做什么才能让 @Order 中定义的值生效。

最佳答案

我已经能够通过直接加载配置来让 Spring 使用 @Order 注释(即,无需使用 通过 @Configuration 类绕道) @导入):

@SpringJUnitConfig({RogueConfig.class, RewardsConfig.class})
public class CdiTest {

    @Test
    public void testCdiWithIdenticalBeans(@Autowired RewardNetwork rewardNetwork) {
        assertThat(rewardNetwork).isNotNull();
    }
}

使用 RogueConfig 类上的 @Order(2) 注释,该 bean 最后加载,如 stdout 中所示:

此 Bean 已从以下位置加载:config.RogueConfig$$EnhancerBySpringCGLIB$$552b937f

似乎在配置类中使用@Import时,它将按照注释中提供的顺序加载bean定义,从而在相应的配置上创建任何@Order注释类没用。

关于java - 带有重复bean和@Order注释的Spring依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56687778/

相关文章:

java - 如何改进我的junit测试

php - Symfony 控制台应用程序 : dependency injection

java - 同步功能如何在 Java 中工作?

java - 将 MyBatis ResultMap 中的非列参数传递给嵌套选择

java - 给定一个数字 n ,我们必须找出小于或等于 n 且恰好有 3 个约数的数字

java - 软删除包位置

java - 如何在同一屏幕上针对不同的应用程序上下文获取不同的 Spring 标签消息

c# - 注入(inject)具有构造函数依赖项的记录器

asp.net-mvc-3 - MVC3 + Ninject : What is the proper way to inject the User IPrincipal?

java - JAR 不显示图像?