当有多个具有相同名称/类型的 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/