学习 准备 尝试 谨慎小心

0%

Spring容器Bean的自动装配顺序

1
@Configuration
2
public class DruidConfig
3
{
4
    @Bean
5
    @ConfigurationProperties("spring.datasource.druid.master")
6
    public DataSource masterDataSource()
7
    {
8
        return DruidDataSourceBuilder.create().build();
9
    }
10
11
    @Bean
12
    @ConfigurationProperties("spring.datasource.druid.slave1")
13
    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave1", name = "enabled", havingValue = "true")
14
    public DataSource slave1DataSource()
15
    {
16
        return DruidDataSourceBuilder.create().build();
17
    }
18
19
    @Bean
20
    @ConfigurationProperties("spring.datasource.druid.slave2")
21
    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave2", name = "enabled", havingValue = "true")
22
    public DataSource slave2DataSource()
23
    {
24
        return DruidDataSourceBuilder.create().build();
25
    }
26
27
    @Bean
28
    @ConfigurationProperties("spring.datasource.druid.slave3")
29
    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave3", name = "enabled", havingValue = "true")
30
    public DataSource slave3DataSource()
31
    {
32
        return DruidDataSourceBuilder.create().build();
33
    }
34
35
    @Bean(name = "dynamicDataSource")
36
    @Primary
37
    public DynamicDataSource dataSource(DataSource masterDataSource, DataSource slave1DataSource, DataSource slave2DataSource, DataSource slave3DataSource)
38
    {
39
        Map<Object, Object> targetDataSources = new HashMap<>();
40
        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
41
        targetDataSources.put(DataSourceType.SLAVE1.name(), slave1DataSource);
42
        targetDataSources.put(DataSourceType.SLAVE2.name(), slave2DataSource);
43
        targetDataSources.put(DataSourceType.SLAVE3.name(), slave3DataSource);
44
        return new DynamicDataSource(masterDataSource, targetDataSources);
45
    }
46
}

在这样一个类中,我迷茫了!

这么多的DataSource,系统运行的时候到底加载了哪一个啊?

干净利落的总结

  • 默认按照类型byType来查找applicationContext.getBean(bean.class)

  • 如果使用了注解 @Qualifier,则用*value值匹配bean名称 *applicationContext.getBean("Qualifier的value值")

  • 如果使用了注解 @Primary,则会优先加载该组件

  • 如果同时使用了@Qualifier@Primary,则按照注解 @Qualifier 的策略查找

  • 如果Spring容器存在多个同类型组件,并且没有使用@Qualifier@Primary,此时会按属性名和bean名称匹配查找 applicationContext.getBean("属性名")

综上所述,当Spring容器中存在多个同类型的bean时,加载优先级:*@Qulifier > @Primary > 属性名 *