@NoRepositoryBean
. के साथ अपना रिपॉजिटरी इंटरफ़ेस बनाएं , हम इसे स्वयं तार-तार कर देंगे:
@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String> {
}
फिर, एक @Configuration
. में क्लास, MongoRepositoryFactoryBean
. का उपयोग करके 2 रिपॉजिटरी बीन्स को इंस्टेंट करें . दोनों रिपॉजिटरी एक ही स्प्रिंग डेटा रिपॉजिटरी इंटरफ़ेस लौटाएंगे, लेकिन हम उन्हें अलग-अलग 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 बीन्स हैं नाम, प्रत्येक अलग-अलग डेटाबेस के लिए कॉन्फ़िगर किया गया है, और एक ही मॉडल का उपयोग कर रहा है।
आप उन्हें @Qualifier
. का उपयोग करके इंजेक्ट कर सकते हैं :
@Autowired
@Qualifier("one")
private ModelMongoRepository mongoRepositoryOne;
@Autowired
@Qualifier("two")
private ModelMongoRepository mongoRepositoryTwo;
सादगी के लिए, मैंने कॉन्फ़िगरेशन क्लास में मानों को हार्ड कोड किया है, लेकिन आप उन्हें application.properties/yml में गुणों से इंजेक्ट कर सकते हैं।
यदि आप स्प्रिंग डेटा इंटरफ़ेस रिपॉजिटरी के लाभों को खोए बिना एक कस्टम कार्यान्वयन बनाना चाहते हैं तो यहां संशोधन है। चश्मा यह कहता है:
एक नया इंटरफ़ेस बनाएं, जिसका तकनीकी रूप से स्प्रिंग डेटा, अच्छे पुराने इंटरफ़ेस से कोई लेना-देना नहीं है:
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");
}
}
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();
}
यदि आप जावा कॉन्फ़िगरेशन के माध्यम से मैन्युअल रूप से भंडार को तार नहीं कर रहे थे, तो इस कार्यान्वयन को ModelMongoRepositoryImpl
नाम देना होगा। इंटरफ़ेस से मिलान करने के लिए ModelMongoRepository +"Impl"
. और इसे वसंत तक स्वचालित रूप से नियंत्रित किया जाएगा।