SpringBoot MongoDBマルチデータソース構成を実現
文書ディレクトリ一、需要背景 二、実装ステップ 1. 依存を追加 2. プロファイルの変更 3. データソース構成クラスの再構築 AbstractMongoConfigure PrimaryMongoConfigure SecondaryMongoConfigure 4. エンティティークラスとインタフェース の作成 User UserRepository 5. 呼び出し例 一、需要背景
MongoDBは分散型ストレージベースのデータベースで、オープンソース、高性能などの特徴を備え、現在のNoSQLデータベースで人気のあるデータベースです.
MySQLと同様に、SpringBootはMongoDB単一データソースに対して良好な統合を実現しており、ほとんどの場合、ユーザーのニーズを満たすことができます.
しかし、今回のニーズはSpringBootプロジェクトでMongoDBマルチデータソース構成を実現することです.これは、元のAPIに基づいていくつかの改造を行う必要があります.詳細は、以下の分解を参照してください.
二、実現手順
1.依存の追加
最初のステップでは、
2.プロファイルの変更
ステップ2では、プロファイル
なお、新たに追加された
3.データソース構成クラスの再構築
第3のステップでは、デフォルトの構成クラス
まず、データソース構成ベースクラス
AbstractMongoConfigure
次に、
PrimaryMongoConfigure
SecondaryMongoConfigure
上記のコードでは、複数の注釈が表示され、キーについて簡単に説明します.@ConfigurationProperties:このクラスを構成クラスと宣言し、プロファイル内の同じ構成項目の値を読み込むことができます.例えば、プレフィックス をとることができる.@EnableMongoRepositories: である.@Primary:このデータソースがプライマリ・データ・ソースであることを宣言し、この注釈を追加しない場合、SpringBootはbeanの生成時に異常 を放出する
4.エンティティークラスとインタフェースの作成
ステップ4では、データエンティティ
User
UserRepository
特に注意が必要なのは、
5.呼び出し例
最後に、
通常、
複雑なビジネスがある場合、
MongoDBは分散型ストレージベースのデータベースで、オープンソース、高性能などの特徴を備え、現在のNoSQLデータベースで人気のあるデータベースです.
MySQLと同様に、SpringBootはMongoDB単一データソースに対して良好な統合を実現しており、ほとんどの場合、ユーザーのニーズを満たすことができます.
しかし、今回のニーズはSpringBootプロジェクトでMongoDBマルチデータソース構成を実現することです.これは、元のAPIに基づいていくつかの改造を行う必要があります.詳細は、以下の分解を参照してください.
二、実現手順
1.依存の追加
最初のステップでは、
pom.xml
ファイルに次の依存を追加する必要があります.
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodbartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
2.プロファイルの変更
ステップ2では、プロファイル
application.properties
に複数のデータソースの情報を追加する.spring.data.mongodb.database=admin
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.authenticationDatabase=admin
spring.data.mongodb.username=mongodb
spring.data.mongodb.password=mongodb
spring.data.mongodb.primary.database=primary_data
spring.data.mongodb.primary.host=127.0.0.1
spring.data.mongodb.primary.port=27017
spring.data.mongodb.primary.authenticationDatabase=admin
spring.data.mongodb.primary.username=mongodb
spring.data.mongodb.primary.password=mongodb
spring.data.mongodb.secondary.database=secondary_data
spring.data.mongodb.secondary.host=127.0.0.1
spring.data.mongodb.secondary.port=27017
spring.data.mongodb.secondary.authenticationDatabase=admin
spring.data.mongodb.secondary.username=mongodb
spring.data.mongodb.secondary.password=mongodb
なお、新たに追加された
primary
とsecondary
のデータソースに加えて、オリジナルのデータソースも正しく構成する必要がある.SpringBootが起動すると、元のデータソースがデフォルトで接続されるため、正しく構成されていないと、プログラムは接続異常を放出します.もちろん、この異常はプログラムの他の部分に影響を与えません.3.データソース構成クラスの再構築
第3のステップでは、デフォルトの構成クラス
MongoProperties
の代わりに、データソース構成クラスを再構築する必要があります.まず、データソース構成ベースクラス
AbstractMongoConfigure
を作成する.AbstractMongoConfigure
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
/**
* Mongo
*
* @author xiepd
* @date 2019/7/16
*/
public abstract class AbstractMongoConfigure {
private String database;
private String host;
private int port;
private String authenticationDatabase;
private String username;
private char[] password;
public MongoDbFactory mongoDbFactory() {
MongoDbFactory factory;
if (authenticationDatabase != null && username != null && password != null) {
ServerAddress serverAddress = new ServerAddress(host, port);
MongoCredential credential = MongoCredential.createCredential(username, authenticationDatabase, password);
MongoClientOptions options = MongoClientOptions.builder().build();
factory = new SimpleMongoDbFactory(new MongoClient(serverAddress, credential, options), database);
} else {
factory = new SimpleMongoDbFactory(new MongoClient(host, port), database);
}
return factory;
}
public abstract MongoTemplate getMongoTemplate();
// getter & setter
}
次に、
primary
およびsecondary
にそれぞれ対応する構成クラスPrimaryMongoConfigure
およびSecondaryMongoConfigure
を作成するPrimaryMongoConfigure
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import org.springframework.stereotype.Component;
/**
* @author xiepd
* @date 2019/7/16
*/
@Component
@ConfigurationProperties(prefix = "spring.data.mongodb.primary")
@EnableMongoRepositories(basePackages = "com.panda.mongo.repository.primary", mongoTemplateRef = "primaryMongoTemplate")
public class PrimaryMongoConfigure extends AbstractMongoConfigure {
@Override
@Primary
@Bean(name = "primaryMongoTemplate")
public MongoTemplate getMongoTemplate() {
return new MongoTemplate(mongoDbFactory());
}
}
SecondaryMongoConfigure
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import org.springframework.stereotype.Component;
/**
* @author xiepd
* @date 2019/7/16
*/
@Component
@ConfigurationProperties(prefix = "spring.data.mongodb.secondary")
@EnableMongoRepositories(basePackages = "com.panda.mongo.repository.secondary", mongoTemplateRef = "secondaryMongoTemplate")
public class SecondaryMongoConfigure extends AbstractMongoConfigure {
@Override
@Bean(name = "secondaryMongoTemplate")
public MongoTemplate getMongoTemplate() {
return new MongoTemplate(mongoDbFactory());
}
}
上記のコードでは、複数の注釈が表示され、キーについて簡単に説明します.
prefix
をuser
とすると、現在のクラスのname
の属性は、プロファイル中のuser.name
の値repository
ディレクトリとmongoTemplate
の対応関係を構成します.つまり、あるディレクトリの下のrepository
インタフェースがどのmongoTemplate
を採用しているかを示します.このmongoTemplate
は、データソースに対応する4.エンティティークラスとインタフェースの作成
ステップ4では、データエンティティ
User
と操作インタフェースUserRepository
を作成する.User
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
/**
*
*/
@Document(collection = "user")
public class User {
@Id
private String id;
@Field(value = "name")
private String name;
@Field(value = "age")
private Integer age;
// getter & setter
}
UserRepository
package com.panda.mongo.repository.primary;
import com.panda.mongo.entity.User;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
* Created by xiepd on 2019/07/16.
*/
public interface UserRepository extends MongoRepository<User, String> {
}
特に注意が必要なのは、
repository
が存在するディレクトリが対応するmongoTemplate
を決定し、ディレクトリを間違えてはならないことです.5.呼び出し例
最後に、
Service
インプリメンテーションコールを作成します.import com.panda.mongo.repository.primary.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* Created by xiepd on 2019/07/16.
*/
@Service
public class UserService {
@Autowired
private UserRepository repository;
@Resource(name = "primaryMongoTemplate")
private MongoTemplate mongoTemplate;
// CRUD method
}
通常、
repository
インタフェースは、UserRepository
を正しいディレクトリの下に配置し、SpringBootで注入するだけで簡単な削除変更方法を予め設定しています.複雑なビジネスがある場合、
mongoTemplate
のインスタンスを直接取得し、CRUDメソッドを実装することができる.このインスタンスの取得方法は簡単で、@Resource
で名前を注釈して指定すれば、SpringBootは管理beanから名前が一致するmongoTemplate
インスタンスを自動的に検索します.