Spring Data desteği

Bu makalede Spring Cloud Azure ve Spring Data'nın birlikte nasıl kullanılabildiği açıklanmaktadır.

Spring Data Azure Cosmos DB desteği

Azure Cosmos DB, geliştiricilerin SQL, MongoDB, Graph ve Azure Tablo depolama gibi çeşitli standart API'leri kullanarak verilerle çalışmasına olanak tanıyan küresel olarak dağıtılmış bir veritabanı hizmetidir.

Bağımlılık kurulumu

<dependency>
   <groupId>com.azure.spring</groupId>
   <artifactId>spring-cloud-azure-starter-data-cosmos</artifactId>
</dependency>

Konfigürasyon

Not

Azure kaynağına erişim için Microsoft Entra ID ile kimlik doğrulaması yapmak ve yetkilendirmek için bir güvenlik sorumlusu kullanıyorsanız güvenlik sorumlusuna Azure kaynağına erişmek için yeterli izin verildiğinden emin olun. Daha fazla bilgi için bkz. Microsoft Entra ID ile erişimi yetkilendirme.

Aşağıdaki tabloda spring-cloud-azure-starter-data-cosmosyapılandırılabilir özellikleri listelenir:

Mülk Açıklama
spring.cloud.azure.cosmos.enabled Azure Cosmos DB Hizmeti'nin etkinleştirilip etkinleştirilmediğini gösteren değer. Varsayılan değer true.
spring.cloud.azure.cosmos.database Azure Cosmos DB veritabanı kimliği.
spring.cloud.azure.cosmos.endpoint Azure Cosmos DB'ye bağlanmak için URI.
spring.cloud.azure.cosmos.key Azure Cosmos DB'ye bağlanmak için PrivateKey.
spring.cloud.azure.cosmos.credential.client-certificate-password Sertifika dosyasının parolası.
spring.cloud.azure.cosmos.credential.client-certificate-path Azure ile hizmet sorumlusu kimlik doğrulaması gerçekleştirirken kullanılacak PEM sertifika dosyasının yolu.
spring.cloud.azure.cosmos.credential.client-id Azure ile hizmet sorumlusu kimlik doğrulaması gerçekleştirirken kullanılacak istemci kimliği.
spring.cloud.azure.cosmos.credential.client-secret Azure ile hizmet sorumlusu kimlik doğrulaması gerçekleştirirken kullanılacak istemci gizli dizisi.
spring.cloud.azure.cosmos.credential.managed-identity-enabled Yönetilen kimliğin etkinleştirilip etkinleştirilmeyileceği. Varsayılan değer false.
spring.cloud.azure.cosmos.credential.password Azure ile kullanıcı adı/parola kimlik doğrulaması gerçekleştirirken kullanılacak parola.
spring.cloud.azure.cosmos.credential.username Azure ile kullanıcı adı/parola kimlik doğrulaması gerçekleştirirken kullanılacak kullanıcı adı.
spring.cloud.azure.cosmos.populate-query-metrics Tanılama dizelerinin ve sorgu ölçümlerinin doldurulup doldurulmayacağını gösteren değer. Varsayılan değer false.
spring.cloud.azure.cosmos.consistency-level Azure Cosmos DB için tutarlılık düzeyi.

Temel kavramlar

Aşağıdaki listede Spring Data desteğinin temel kavramları gösterilmektedir:

  • Spring Data CrudRepository ve ReactiveCrudRepository, aşağıdaki temel CRUD işlevselliğini sağlar:

    • kurtarmak
    • tümünüBul
    • kimliğine göre bul
    • hepsini sil
    • kimlikle silme
    • varlığı silme
  • Spring Data @Id ek açıklaması. Etki alanı sınıfındaki bir alanı Azure Cosmos DB belgesinin id eşlemenin iki yolu vardır:

    • @Idile etki alanı sınıfında bir alana ek açıklama ekleyin. Bu alan, Azure Cosmos DB'deki belge id eşlenir.
    • Bu alanın adını idolarak ayarlayın. Bu alan, Azure Cosmos DB'deki belge id eşlenir.

    Not

    Her iki yöntem de uygulanırsa, @Id ek açıklaması daha yüksek önceliğe sahiptir.

  • Özel koleksiyon adları. Varsayılan olarak, koleksiyon adı kullanıcı etki alanı sınıfının sınıf adı olur. Özelleştirmek için, etki alanı sınıfınıza ek açıklama @Document(collection="myCustomCollectionName") ekleyin, hepsi bu kadar.

  • Azure Cosmos DB bölümünüdestekler. Etki alanı sınıfınızın bir alanını bölüm anahtarı alanı olarak belirtmek için, @PartitionKeyile buna ek açıklama ekleyin. CRUD işlemleri yaparken bölüm değerinizi belirtin. Daha fazla örnek için bkz. GitHub'da AddressRepositoryIT.java.

  • Spring Data özel sorgu bulma işlemini destekler.

  • destekler spring-boot-starter-data-rest.

  • Etki alanı sınıflarında Liste ve iç içe türleri destekler.

Temel kullanım

Azure Cosmos DB'ye erişmek için özel anahtar kullanma

Azure Cosmos DB'yi spring-cloud-azure-starter-data-cosmos bağlamanın en basit yolu birincil anahtardır. Aşağıdaki özellikleri ekleyin:

spring:
  cloud:
    azure:
      cosmos:
        key: ${AZURE_COSMOS_KEY}
        endpoint: ${AZURE_COSMOS_ENDPOINT}
        database: ${AZURE_COSMOS_DATABASE}

Varlık tanımlama

Aşağıdaki örnekte gösterildiği gibi Azure Cosmos DB'de bir varlığı Belge olarak tanımlayın:

@Container(containerName = "mycollection")
public class User {
    @Id
    private String id;
    private String firstName;
    @PartitionKey
    private String lastName;
    private String address;

    public User() {
    }

    public User(String id, String firstName, String lastName, String address) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.address = address;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return String.format("%s %s, %s", firstName, lastName, address);
    }
}

id alanı, Azure Cosmos DB'de belge id olarak kullanılır. Alternatif olarak, @Idbelgeyle eşlemek için id ile herhangi bir alana açıklama ekleyebilirsiniz.

Ek açıklama @Container(containerName = "mycollection"), Azure Cosmos DB'de belgenizin koleksiyon adını belirtmek için kullanılır.

Depo oluşturma

Depo oluşturmak için Spring Data depo desteği sağlayan ReactiveCosmosRepository arabirimini genişletin.

@Repository
public interface UserRepository extends ReactiveCosmosRepository<User, String> {
    Flux<User> findByFirstName(String firstName);
}

Şu anda ReactiveCosmosRepository arabirimi temel kaydetme, silme ve bulma işlemlerini sağlar. Daha sonra daha fazla işlem desteklenecektir.

Uygulama sınıfı oluşturma

Aşağıdaki örnek, tüm bileşenlerle bir uygulama sınıfı oluşturur:

@SpringBootApplication
public class CosmosSampleApplication implements CommandLineRunner {

private static final Logger LOGGER = LoggerFactory.getLogger(CosmosSampleApplication.class);

    @Autowired
    private UserRepository repository;

    @Autowired
    private CosmosProperties properties;

    public static void main(String[] args) {
        SpringApplication.run(CosmosSampleApplication.class, args);
    }

    public void run(String... var1) {
        final User testUser = new User("testId", "testFirstName",
                "testLastName", "test address line one");

        // Save the User class to Azure Cosmos DB database.
        final Mono<User> saveUserMono = repository.save(testUser);

        final Flux<User> firstNameUserFlux = repository.findByFirstName("testFirstName");

        //  Nothing happens until we subscribe to these Monos.
        //  findById won't return the user as user isn't present.
        final Mono<User> findByIdMono = repository.findById(testUser.getId());
        final User findByIdUser = findByIdMono.block();
        Assert.isNull(findByIdUser, "User must be null");

        final User savedUser = saveUserMono.block();
        Assert.state(savedUser != null, "Saved user must not be null");
        Assert.state(savedUser.getFirstName().equals(testUser.getFirstName()),
                "Saved user first name doesn't match");

        firstNameUserFlux.collectList().block();

        final Optional<User> optionalUserResult = repository.findById(testUser.getId()).blockOptional();
        Assert.isTrue(optionalUserResult.isPresent(), "Cannot find user.");

        final User result = optionalUserResult.get();
        Assert.state(result.getFirstName().equals(testUser.getFirstName()),
                "query result firstName doesn't match!");
        Assert.state(result.getLastName().equals(testUser.getLastName()),
                "query result lastName doesn't match!");
        LOGGER.info("findOne in User collection get result: {}", result.toString());

    }

    @PostConstruct
    public void setup() {
        // For this example, remove all of the existing records.
        this.repository.deleteAll().block();
    }
}

Bu örnek, kaydetme, silme ve bulma işlemlerini desteklemek için otomatik olarak kablolu UserRepository arabirimini içerir.

Örnekleri

GitHub'da bölümüne azure-spring-boot-samples bakın.

spring-cloud-azure-starter-data-cosmos kitaplığını kullanmanın dışında, daha karmaşık senaryolar için doğrudan azure-spring-data-cosmos kitaplığını kullanabilirsiniz. Daha fazla bilgi için bkz. Azure Cosmos DB için Spring Data istemci kitaplığı.