根据上一篇的MongoDB项目搭建基础上,新增需求添加多数据源选择,在此记录一下:
其实变动不是很大,只要是修改一下mongodb-context.xml的内容即可。在这里补充一点,之前的配置文件里面关于连接数据库的部分代码,后来在网上查资料发现 mongo:mongo 标签和 mongo:mongo-client都可以作为连接数据库来使用,具体区别网上有答案,请小伙伴们自行百度吧。这里贴上最新的代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd ">
<!-- 加载mongodb的属性配置文件 -->
<context:property-placeholder location="classpath*:mongo_config.properties"/>
<!-- GM数据库 start-->
<mongo:mongo-client host="127.0.0.1" port="27017" credentials="用户:密码@数据库" id="dataSource_games_gm">
<mongo:client-options write-concern="SAFE"/>
</mongo:mongo-client>
<mongo:db-factory id="mongoDbFactory" dbname="local" mongo-ref="dataSource_games_gm" />
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
<constructor-arg name="mongoConverter" ref="mappingMongoConverter" />
</bean>
<!-- GM数据库 end-->
<!-- game数据库 start-->
<mongo:mongo-client host="127.0.0.1" port="27017" credentials="用户:密码@数据库" id="dataSource_games_game">
<mongo:client-options write-concern="SAFE"/>
</mongo:mongo-client>
<mongo:db-factory id="mongoDbFactoryData" dbname="game" mongo-ref="dataSource_games_game" />
<bean id="mongoTemplateData" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactoryData"/>
<constructor-arg name="mongoConverter" ref="mappingMongoConverter" />
</bean>
<!-- game数据库 end-->
<!-- 去掉MongoDB数据中的_class属性的方法 -->
<bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
<bean id="defaultMongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
<constructor-arg name="typeKey">
<null />
</constructor-arg>
</bean>
<bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mappingContext" ref="mappingContext" />
<property name="typeMapper" ref="defaultMongoTypeMapper" />
</bean>
<!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 -->
<mongo:mapping-converter base-package="com.games.admin.model"/>
<!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 -->
<mongo:repositories base-package="com.games.admin.dao"/>
<!-- 自定义注解 -->
<bean class="com.games.admin.utils.SaveMongoEventListener"></bean>
<!-- 项目启动加载工具类 -->
<bean class="com.games.admin.interceptor.SpringLoadCompleteInterceptor" />
<bean id="SpringContextUtil" class="com.games.admin.interceptor.SpringContextUtil"/>
</beans>
切换数据源工具类:
@Service
public class ChooseMongoTemplateDaoImpl implements ChooseMongoTemplateDao{
//加载数据源
@Resource
public MongoTemplate mongoTemplate;
@Resource
public MongoTemplate mongoTemplateData;
/**
* 根据地区ID选择数据源
*/
public MongoTemplate chooseMongoTemplate(int areaId){
if(areaId == 403){
return mongoTemplateData;
}else{
return mongoTemplate;
}
}
}
这里呢,我写的是一个借口,通过一个字段来判断调用哪个 数据源 对象。这里需要特别注意的是注解 @resource,如何使用小伙伴们自行百度吧。
好了,一个简单的切换数据源就完成了。如果有更好的办法欢迎留言!