目前都配置了相同的bean,期望是以后能配置5个不同的数据源
1.在有5个项目配置了5个相同id的bean时
可以看到bean被覆盖了4次,只有一个bean生效
2.修改数据源datasourceBean的其中一个项目的BeanID,其余不变
所有该类型的bean在声明时候被声明为primary
发生异常,可以看到不同id的bean由于都被设置成primary导致异常
很容易理解,primary对于不同ID相同的Class实例来说只能有一个,对于相同的ID实例则会直接覆盖
3.修改数据源datasourceBean的其中一个项目的BeanID及不声明为primary,其余不变,其余所有该类型的bean在声明时候被声明为primary
正常启动,可以看到创建了两个相同类型的实例
4.修改数据源datasourceBean的其中一个项目的Bean的Class及不声明为primary,其余不变
其余所有该类型的bean在声明时候被声明为primary
可以看到发生覆盖情况,因此可以总结出
bean是否发生覆盖只跟beanId有关而跟bean的类型无关
当两个相同的类型的bean都被配置成primary时会发生异常
当需要配置多数据源时,需要为每个子系统的bean配置不同的ID,以防发生覆盖
下面再接着说一下Springboot对.properties文件的读取
我们知道在使用springboot的脚手架建立项目时默认会有application.properties的配置文件
Springboot读取.properties文件的读取顺序如下所示
其中需要注意的是Springboot对于同文件名只读取一次,高优先级覆盖低优先级
以上是错误的解读,实际上SpringBoot是对相同的属性以先读取的为主,文件仍然会读取多次
如果上面的图容易产生混乱的话看下面的顺序就好理解了
通俗的说SpringBoot默认只加载application-{profile}.properites
当没有指定Profile时会默认加载application.properties文件
而当指定了SpringBoot的Profile时则会默认加载application-{profile}.properties文件
当然也可以让SpringBoot除了加载默认文件以外也可以人为指定加载额外的properties文件
在我们的项目中则是通过这种方式进行
这样SpringBoot会去同时检索application-{profile}和application文件
检索顺序如上面的图所示
接下面我们进行验证
配置两个bean
第一个bean
这里的属性通过主项目的application-dev.properties文件进行注入
第二个bean
属性通过子项目的application.properties文件进行注入
子项目目录结构
可以看出并没有符合规范结构
我们让主项目引用子项目的jar包
运行结果
启动报错,没有读取成功
接下来我们修改子项目的结构
可以看到现在已经符合规范结构,重新打包编译再进行验证
正常启动,说明此时属性注入正常,application.properties被成功读取
然后我们修改application.properties文件名为application-dev
预期结果会出现覆盖现象
正常启动,打脸了,翻阅资料发现
文件的读取是多次的,对相同的属性值来说以先读取的为标准,但是不同的属性依然可以正常读取
通过验证发现,想要在子项目配置多个子项目的情况下每个项目想引用不同的数据源首先需要保证
1.每个子项目必须配置不同ID的bean,否则出现覆盖现象,需要注意的是各个子系统中的sqlSessionFactiory所指定的mapper.xml路径不要出现重复,否则会造成一条SQL被多个bean命中切面
2.子系统所指定的.properties文件中与主系统.properties文件名相同时,若出现相同属性,以先读取的为主
3.除非特殊设置读取路径,否则需要按照规范放在指定路径下容器才能读取properties文件