1. 程式人生 > >多資料來源MongoDB的使用(法二:lombok+MongoDbFactory+MongoProperties+註解).md

多資料來源MongoDB的使用(法二:lombok+MongoDbFactory+MongoProperties+註解).md


  1. pom包的設定:新增lombok和spring-boot-autoconfigure包引用
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>RELEASE</version>
</dependency>
  1. 配置檔案使用YAML的形式新增兩條資料來源,如下:
mongodb:
  primary:
    host: 192.168.9.60
    port: 20000
    database: test
  secondary:
    host: 192.168.9.60
    port: 20000
    database: test1

本mongodb環境沒有設定許可權認證。
  1. 配置兩個庫的資料來源(包括MongoDbFactory和MongoTemplate的配置)

載入資料來源配置物件MultipleMongoProperties

@Data
@ConfigurationProperties(prefix = "mongodb")
public class MultipleMongoProperties {

    private MongoProperties primary = new MongoProperties();
    private MongoProperties secondary = new MongoProperties();
}

配置不同包路徑下使用不同的資料來源

第一個庫的封裝

@Configuration
@EnableMongoRepositories(basePackages = "com.neo.model.repository.primary",
        mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
public class PrimaryMongoConfig {

    protected static final String MONGO_TEMPLATE = "primaryMongoTemplate";
}

第二個庫的封裝

@Configuration
@EnableMongoRepositories(basePackages = "com.neo.model.repository.secondary",
        mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
public class SecondaryMongoConfig {

    protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
}

讀取對應的配置資訊並且構造對應的MongoTemplate(建立各資料來源的MongoTemplate)

/**
 * 獲取各資料來源MongoTemplate
 *
 */
@Configuration
public class MultipleMongoConfig {

    @Autowired
    private MultipleMongoProperties mongoProperties;

    @Primary
    @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
    public MongoTemplate primaryMongoTemplate() throws Exception {
        return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
    }

    @Bean
    @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
    public MongoTemplate secondaryMongoTemplate() throws Exception {
        return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
    }

    @Bean
    @Primary
    public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
        return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                mongo.getDatabase());
    }

    @Bean
    public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {
        return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                mongo.getDatabase());
    }
}

本例項mongodb環境沒有設定許可權認證的,可以簡單的通過newSimpleMongoDbFactory(newMongoClient(host, port), database)實現對MongoDbFactory的建立。
  1. 建立兩個庫分別對應的物件和Repository

藉助lombok來構建物件

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "first_mongo")
public class PrimaryMongoObject {

    @Id
    private String id;

    private String value;

    @Override
    public String toString() {
        return "PrimaryMongoObject{" + "id='" + id + '\'' + ", value='" + value + '\''
                + '}';
    }
}

對應的Repository

public interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> {
}

public interface SecondaryRepository extends MongoRepository<SecondaryMongoObject, String> {
}

繼承了 MongoRepository會預設實現很多基本的增刪改查,省了很多自己寫dao層的程式碼。
  1. 實現service層的開發