当前位置: 首页 > 知识库问答 >
问题:

使用重复bean和@Order注释的Spring依赖注入

林鹭洋
2023-03-14

当有多个具有相同名称/类型的bean时,我对Spring中的DI注入机制有点困惑。根据Pivotal“核心Spring”课程的考试幻灯片,Spring对相同豆子的行为可以归结为:

  • 可以多次定义同一bean
  • Spring注入上次定义的bean
  • 使用订单可以修改加载机制(从而修改最后加载哪个bean)

然而,在下面的示例中,Spring将忽略任何顺序注释,并从Import语句中最后提到的Config类注入bean。因此,我想知道导入注释中配置类的顺序是否会覆盖任何注释。还是我错过了另一个要点?非常感谢您的任何提示。感谢堆栈溢出!

主配置类

@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);
    }
}

无论我分配了什么值,或者如果我使用了排序,结果总是:

此Bean已从:config加载。RewardsConfig$$EnhancerBySpringCGLIB$$62461c55

改变这一点的唯一方法是修改my TestInfrastructureConfig中的导入注释,如下所示:

导入({RewardsConfig.class,RogueConfig.class}),生成:

此Bean已从:config加载。RogueConfig$$EnhancerBySpringCGLIB$$6ca7bc89

我想知道需要做些什么才能使订单中定义的值生效。

共有1个答案

鲜于浩淼
2023-03-14

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

@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定义,从而使相应配置类上的任何注释都无用。

 类似资料:
  • 如果我使用,那是什么意思?极高?

  • 我想向Springbean注入一个单例对象依赖关系。问题是我无法访问和修改要注入其对象的类。让我描述一下这个例子。 所以我有我的接口,以及这个接口的实现,如下所示。 然后在我的配置类中,我正在创建一个bean,但是我需要在构造函数中向它传递对象,问题是我不能使成为bean,因为它来自外部包,我不能修改它。 所以我想做的是,能够将/autowire参数传递给bean。目前IntelliJ给我一个错误

  • 17. Spring的bean以及依赖注入 您可以自由使用任何标准的Spring Framework技术来定义您的bean及其注入的依赖。为简单起见,我们经常发现结合@Autowired构造方法注入来使用@ComponentScan查找bean效果非常好。 如果您按照上述建议(将您的application类放置于根包中),则可以添加@ComponentScan注解而无需任何参数。您所有的程序组件(

  • 我有一个Spring bean,在Spring Bean中我有一个对其他bean列表的依赖项。我的问题是:如何注入一个通用的bean列表作为该bean的依赖项? 例如,一些代码: 我的豆子: 问题是:;如何在Painter中获得颜色列表?另外,还有一点:我应该让@Configuration返回接口类型还是类? 谢谢你的帮助!

  • 我有一个Spring启动应用程序,我最近从v1.3.3. RELEASE升级到v1.4.2. RELEASE。 用于我在v1中的集成测试。3.3,我有一个豆子,我能够成功地监视它。我在运行测试时,配置文件,下面的被激活,而不是应用程序的。 我正在升级到v1。4.2.发布并希望使用spyBean注释模拟单个方法,而不依赖于概要文件。 我对我的测试方法做了以下改变,以尝试它- 然而,当我尝试上述方法时

  • 问题内容: Spring在以下方面很好地支持JUnit:使用和注释,事情看起来非常直观 该测试将能够在Eclipse&Maven中正确运行。我想知道TestNG是否有类似的东西。我正在考虑迁移到“下一代”框架,但没有找到与Spring测试匹配的对象。 问题答案: 它也可以与TestNG一起使用。