sql >> データベース >  >> NoSQL >> MongoDB

複数のデータソースで使用するためのSpringDataリポジトリBean名のカスタマイズ

    @NoRepositoryBeanを使用してリポジトリインターフェースを作成します 、自分で配線します:

    @NoRepositoryBean
    public interface ModelMongoRepository extends MongoRepository<Model, String> {
    }      
    

    次に、@Configurationで クラス、MongoRepositoryFactoryBeanを使用して2つのリポジトリBeanをインスタンス化します 。両方のリポジトリは同じSpringDataRepositoryインターフェースを返しますが、異なるMongoOperationsを割り当てます。 (例:データベースの詳細):

    @Configuration
    @EnableMongoRepositories
    public class MongoConfiguration {
    
        @Bean
        @Qualifier("one")
        public ModelMongoRepository modelMongoRepositoryOne() throws DataAccessException, Exception {
            MongoRepositoryFactoryBean<ModelMongoRepository, Model, String> myFactory = new MongoRepositoryFactoryBean<ModelMongoRepository, Model, String>();
            myFactory.setRepositoryInterface(ModelMongoRepository.class);
            myFactory.setMongoOperations(createMongoOperations("hostname1", 21979, "dbName1", "username1", "password1"));
            myFactory.afterPropertiesSet();
            return myFactory.getObject();
        }
    
        @Bean
        @Qualifier("two")
        public ModelMongoRepository modelMongoRepositoryTwo() throws DataAccessException, Exception {
            MongoRepositoryFactoryBean<ModelMongoRepository, Model, String> myFactory = new MongoRepositoryFactoryBean<ModelMongoRepository, Model, String>();
            myFactory.setRepositoryInterface(ModelMongoRepository.class);
            myFactory.setMongoOperations(createMongoOperations("hostname2", 21990, "dbName2", "username2", "password2"));
            myFactory.afterPropertiesSet();
            return myFactory.getObject();
        }
    
        private MongoOperations createMongoOperations(String hostname, int port, String dbName, String user, String pwd) throws DataAccessException, Exception {
            MongoCredential mongoCredentials = MongoCredential.createScramSha1Credential(user, dbName, pwd.toCharArray());
            MongoClient mongoClient = new MongoClient(new ServerAddress(hostname, port), Arrays.asList(mongoCredentials));
            Mongo mongo = new SimpleMongoDbFactory(mongoClient, dbName).getDb().getMongo();
            return new MongoTemplate(mongo, dbName);
        }
        //or this one if you have a connection string
        private MongoOperations createMongoOperations(String dbConnection) throws DataAccessException, Exception {
            MongoClientURI mongoClientURI = new MongoClientURI(dbConnection);
            MongoClient mongoClient = new MongoClient(mongoClientURI);
            Mongo mongo = new SimpleMongoDbFactory(mongoClient, mongoClientURI.getDatabase()).getDb().getMongo();
            return new MongoTemplate(mongo, mongoClientURI.getDatabase());
        }
    }
    

    これで、異なる@Qualifierを持つ2つのBeanができました。 それぞれが異なるデータベース用に構成され、同じモデルを使用している名前。

    @Qualifierを使用してそれらを注入できます :

    @Autowired
    @Qualifier("one")
    private ModelMongoRepository mongoRepositoryOne;
    
    @Autowired
    @Qualifier("two")
    private ModelMongoRepository mongoRepositoryTwo;
    

    簡単にするために、構成クラスに値をハードコーディングしましたが、application.properties/ymlのプロパティから値を挿入できます。

    Springデータインターフェイスリポジトリの利点を失うことなくカスタム実装を作成する場合の変更点は次のとおりです。仕様によると:

    技術的には春のデータとは関係のない新しいインターフェース、古き良きインターフェースを作成します:

    public interface CustomMethodsRepository {
        public void getById(Model model){
    }
    

    リポジトリインターフェースにこの新しいインターフェースを拡張させます:

    @NoRepositoryBean
    public interface ModelMongoRepository extends MongoRepository<Model, String>, CustomMethodsRepository {
    } 
    

    次に、実装クラスを作成します。これはのみ スプリングデータ以外のインターフェースを実装します:

    public class ModelMongoRepositoryImpl  implements CustomModelMongoRepository {
        private MongoOperations mongoOperations;
    
        public ModelMongoRepositoryImpl(MongoOperations mongoOperations) {
            this.mongoOperations = mongoOperations;
        }
        public void getById(Model model){
            System.out.println("test");
        }
    }
    

    Java構成を変更して、myFactory.setCustomImplementation(new ModelMongoRepositoryImpl());を追加します。 :

    @Bean
    @Qualifier("one")
    public ModelMongoRepository modelMongoRepositoryOne() throws DataAccessException, Exception {
        MongoRepositoryFactoryBean<ModelMongoRepository, Model, String> myFactory = new MongoRepositoryFactoryBean<ModelMongoRepository, Model, String>();
        MongoOperations mongoOperations = createMongoOperations("hostname1", 21979, "dbName1", "usdername1", "password1");
        myFactory.setCustomImplementation(new ModelMongoRepositoryImpl(mongoOperations));
        myFactory.setRepositoryInterface(ModelMongoRepository.class);
        myFactory.setMongoOperations(mongoOperations);
    
        myFactory.afterPropertiesSet();
        return myFactory.getObject();
    }
    

    Java構成を介してリポジトリを手動で配線していない場合、この実装にはModelMongoRepositoryImplという名前を付ける必要があります。 インターフェイスに一致するModelMongoRepository +"Impl" 。そして、それは春までに自動的に処理されます。



    1. iOSからMongoDBに接続する方法(Swift)

    2. Djangoチャネルエラー-バックエンドをインポートできません'asgi_redis.RedisChannelLayer'

    3. node.jsでmongodbに接続(および認証)するにはどうすればよいですか?

    4. symfony2フォームの選択とmongodb