1 | |
2 | public class DruidConfig |
3 | { |
4 | |
5 | ("spring.datasource.druid.master") |
6 | public DataSource masterDataSource() |
7 | { |
8 | return DruidDataSourceBuilder.create().build(); |
9 | } |
10 | |
11 | |
12 | ("spring.datasource.druid.slave1") |
13 | (prefix = "spring.datasource.druid.slave1", name = "enabled", havingValue = "true") |
14 | public DataSource slave1DataSource() |
15 | { |
16 | return DruidDataSourceBuilder.create().build(); |
17 | } |
18 | |
19 | |
20 | ("spring.datasource.druid.slave2") |
21 | (prefix = "spring.datasource.druid.slave2", name = "enabled", havingValue = "true") |
22 | public DataSource slave2DataSource() |
23 | { |
24 | return DruidDataSourceBuilder.create().build(); |
25 | } |
26 | |
27 | |
28 | ("spring.datasource.druid.slave3") |
29 | (prefix = "spring.datasource.druid.slave3", name = "enabled", havingValue = "true") |
30 | public DataSource slave3DataSource() |
31 | { |
32 | return DruidDataSourceBuilder.create().build(); |
33 | } |
34 | |
35 | (name = "dynamicDataSource") |
36 | |
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 > 属性名 *