Prise en charge de Spring Data Java 8

Prise en charge de Spring Data Java 8

1. Vue d'ensemble

Spring Data prend désormais en charge les fonctionnalités principales de Java 8 - telles queOptional, l'APIStream etCompletableFuture.

Dans cet article rapide, nous allons passer en revue quelques exemples de la façon dont nous pouvons les utiliser avec le framework.

2. Optional

Commençons par les méthodes du référentiel CRUD - qui encapsulent maintenant les résultats enOptional:

public interface CrudRepository extends Repository {

    Optional findById(ID id);

}

Lorsque vous retournez une instanceOptional, c'est un indice utile indiquant qu'il est possible que la valeur n'existe pas. Plus d'informations sur Optionnel peuvent être trouvéeshere.

Il ne nous reste plus qu'à spécifier le type de retour en tant queOptional:

public interface UserRepository extends JpaRepository {

    Optional findOneByName(String name);

}

3. APIStream

Spring Data fournit également la prise en charge de l'une des fonctionnalités les plus importantes de Java 8 - l'APIStream.

Dans le passé, chaque fois que nous devions renvoyer plusieurs résultats, nous devions renvoyer une collection:

public interface UserRepository extends JpaRepository {
    // ...
    List findAll();
    // ...
}

L'un des problèmes de cette implémentation était la consommation de mémoire.

Nous devions charger et conserver tous les objets récupérés avec empressement.

Nous pourrions améliorer en tirant parti de la radiomessagerie:

public interface UserRepository extends JpaRepository {
    // ...
    Page findAll(Pageable pageable);
    // ...
}

Dans certains scénarios, cela suffit, mais dans d’autres, la pagination n’est vraiment pas la voie à suivre, en raison du nombre élevé de requêtes nécessaires pour récupérer les données.

Grâce aux fournisseurs API et JPA de Java 8Stream - nous pouvons maintenantdefine that our repository method returns just a Stream of objects:

public interface UserRepository extends JpaRepository {
    // ...
    Stream findAllByName(String name);
    // ...
}

Spring Data utilise une implémentation spécifique au fournisseur pour diffuser le résultat (Hibernate utiliseScrollableResultSet, EclipseLink utiliseScrollableCursor). Il réduit la quantité de mémoire utilisée et interroge les appels vers une base de données. Pour cette raison, il est également beaucoup plus rapide que deux solutions mentionnées précédemment.

Processing data with a Stream requires us to close a Stream when we finish it.

Cela peut être fait en appelant la méthodeclose() sur unStream ou en utilisanttry-with-resources:

try (Stream foundUsersStream
  = userRepository.findAllByName(USER_NAME_ADAM)) {

assertThat(foundUsersStream.count(), equalTo(3l));

We must also remember to call a repository method within a transaction. Sinon, nous obtiendrons une exception:

org.springframework.dao.InvalidDataAccessApiUsageException: vous essayez d'exécuter une méthode de requête en continu sans transaction environnante qui maintient la connexion ouverte afin que lesStream puissent réellement être consommés. Assurez-vous que le code consommant le flux utilise@Transactional ou tout autre moyen de déclarer une transaction (en lecture seule).

4. CompletableFuture

Spring Data repositories can run asynchronously with the support of Java 8’s CompletableFuture et mécanisme Spring pour l'exécution de méthodes asynchrones:

@Async
CompletableFuture findOneByStatus(Integer status);

Un client qui appelle cette méthode renverra immédiatement un futur, mais une méthode continuera son exécution dans un autre thread.

Plus d'informations sur le traitement deCompletableFuture peuvent être trouvéeshere.

5. Conclusion

Dans ce didacticiel, nous avons montré le fonctionnement des fonctionnalités de Java 8 avec Spring Data.

L'implémentation complète des exemples est disponibleover on Github.