SpringBoot MongoDBマルチデータソース構成を実現


文書ディレクトリ
  • 一、需要背景
  • 二、実装ステップ
  • 1. 依存を追加
  • 2. プロファイルの変更
  • 3. データソース構成クラスの再構築
  • AbstractMongoConfigure
  • PrimaryMongoConfigure
  • SecondaryMongoConfigure
  • 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
    

    なお、新たに追加されたprimarysecondaryのデータソースに加えて、オリジナルのデータソースも正しく構成する必要がある.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());
        }
    }
    

    上記のコードでは、複数の注釈が表示され、キーについて簡単に説明します.
  • @ConfigurationProperties:このクラスを構成クラスと宣言し、プロファイル内の同じ構成項目の値を読み込むことができます.例えば、プレフィックスprefixuserとすると、現在のクラスのnameの属性は、プロファイル中のuser.nameの値
  • をとることができる.
  • @EnableMongoRepositories:repositoryディレクトリとmongoTemplateの対応関係を構成します.つまり、あるディレクトリの下のrepositoryインタフェースがどのmongoTemplateを採用しているかを示します.このmongoTemplateは、データソースに対応する
  • である.
  • @Primary:このデータソースがプライマリ・データ・ソースであることを宣言し、この注釈を追加しない場合、SpringBootはbeanの生成時に異常
  • を放出する
    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インスタンスを自動的に検索します.