Перевод статьи подготовлен в преддверии старта курса «Разработчик на Spring Framework».
Подробнее о курсе можно узнать посмотрев запись дня открытых дверей.
Для проектов, указанных ниже, увеличен номер мажорной версии из-за изменений, ломающих совместимость в публичных API или драйверах:
Перед тем как перейти к описанию новой функциональности, давайте посмотрим на изменения в API. Подробнее об этом смотрите в разделах по обновлению (“Upgrading”) в документации соответствующих модулей.
Если вы не готовы обновляться сейчас, то имейте в виду, что предыдущий релиз Moore будет поддерживаться еще в течение двенадцати месяцев.
У каждого SQL-хранилища есть свои особенности, требующие особого подхода. Для улучшения их поддержки были внесены изменения, которые повлияли на увеличение мажорной версии. Теперь
Единый jar с драйверами для MongoDB (mongo-java-driver) разбит на несколько: -sync и -reactivestreams, что позволяет вам выбрать только необходимый драйвер. То есть, и синхронный, и реактивный драйверы MongoDB теперь являются необязательными зависимостями, которые необходимо добавлять вручную. При переходе на новые драйвера некоторые из уже устаревших API были окончательно удалены, что повлияло на классы конфигурации, такие как
Давно назревшее обновление драйверов Apache Cassandra до 4.0 не только обновляет пакет и структуру данных, но также изменяет поведение в кластере и в обработке сеансов. Это привело к серьезным изменениям в конфигурации, которые влияют на XML-конфигурацию и могут повлиять на конфигурацию в коде для каких-то сложных сценариев (сложнее, чем простая настройка по умолчанию
Вслед за Couchbase SDK мы обновились с версии 3.x до 4.x, что добавило автоматическое управление индексами и поддержку транзакций. Подробнее читайте в блоге Couchbase.
Добавлена поддержка HTTP Client API, SSL и Proxy. Также сделан ряд изменений, включающих в себя оптимизацию и удаление устаревшего API, что повлияло на изменение мажорного номера версии. В модуль Elasticsearch теперь входит Document, включающий в себя
Теперь давайте перейдем к новшествам.
Релиз Neumann продолжает развитие поддержки корутин Kotlin, начавшуюся в предыдущем релизе Moore, добавив их поддержку в репозиториях.
Корутины поддерживаются через реактивные Spring Data-репозитории. Теперь можно использовать реактивные методы запросов или писать свои suspended-функции.
Эти два небольших изменения улучшают поиск бинов репозиториев и именование методов запросов. Теперь аннотация
Несмотря на то что это было сделано для таких баз данных, как Elasticsearch, давайте двигаться дальше и посмотрим как
До настоящего времени в Spring Data R2DBC для методов запросов использовалась аннотация
Это эквивалентно:
Spring Data JDBC 2.0 поддерживает еще больше реляционных баз данных. Теперь мы запускаем наши интеграционные тесты на H2, HSQLDB, MySQL, MariaDB, PostgreSQL и DB2.
Для этих баз данных мы поддерживаем генерацию запросов и разбивку на страницы. Например:
В этом релизе мы также продолжаем двигаться в сторону NoSQL, начав с MongoDB и нового способа модификации документов.
Это важное изменение (которое не было полностью готово в релизе Moore) позволяет использовать Aggregation Pipeline для обновления данных. Таким образом, изменения могут содержать сложные выражения, такие как условия по значениям полей, например:
Также Spring Data MongoDB, несомненно, выиграет от недавно добавленной в другие модули поддержки встроенных объектов (embedded object).
Apache Cassandra теперь поддерживает маппинг встроенных типов (embedded type), которые уже давно были доступны в Spring Data JDBC. В модели предметной области встроенные объекты используются для объектов-значений (Value Object), свойства которых хранятся в одной таблице. В следующем примере над полем
Поскольку в ElasticSearch наличие
После этого добавление
Spring Data Neo4j теперь поддерживает синтаксис запросов Neo4j 4.0 с параметрами. Синтаксис с заполнителями (placeholder) был ранее объявлен устаревшим, а сейчас полностью удален. Теперь модуль зависит от последних версий драйверов Neo4j-OGM и Neo4j Java для улучшения взаимодействия с последней версией Neo4j.
Также идет активная работа по поддержке реактивности для графовых баз данных и ее интеграция в Spring Data с Neo4j RX (хотя это и не входит в текущий релиз, но уже готово для включения в следующий).
Модули Spring Data для Apache Geode и VMware Tanzu GemFire (
SDG теперь поддерживает публикацию событий автотранзакций, которая преобразует событие Cache TransactionEvent от GemFire / Geode Cache в соответствующий ApplicationEvent контекста.
Также теперь можно приостановить отправку событий на AEQ, настроенном с помощью SDG. Кроме того, при создании приложений на основе GemFire / Geode Locator с использованием аннотации SDG
Узнать подробно о курсе.
Подробнее о курсе можно узнать посмотрев запись дня открытых дверей.
Spring Data Neumann — это первый релиз, после перехода на новый шестимесячный релизный цикл. Сокращение сроков между релизами позволит нам чаще выпускать новые фичи, а это, в свою очередь, ускорит и вас. В этом релизе, помимо нового функционала, есть также важные изменения, потенциально ломающие совместимость с предыдущими версиями.
Изменение мажорных версий
Для проектов, указанных ниже, увеличен номер мажорной версии из-за изменений, ломающих совместимость в публичных API или драйверах:
- Spring Data JDBC 2.0 (предыдущая версия 1.1)
- Миграция с 1.1 на 2.0 описана в этом посте.
- Spring Data MongoDB 3.0 (предыдущая версия 2.2)
- Spring Data для Apache Cassandra 3.0 (предыдущая версия 2.2)
- Spring Data Couchbase 4.0 (предыдущая версия 3.2)
- Spring Data Elasticsearch 4.0 (предыдущая версия 3.2)
- Подробнее об изменениях см. этом посте.
Перед тем как перейти к описанию новой функциональности, давайте посмотрим на изменения в API. Подробнее об этом смотрите в разделах по обновлению (“Upgrading”) в документации соответствующих модулей.
Если вы не готовы обновляться сейчас, то имейте в виду, что предыдущий релиз Moore будет поддерживаться еще в течение двенадцати месяцев.
JDBC
У каждого SQL-хранилища есть свои особенности, требующие особого подхода. Для улучшения их поддержки были внесены изменения, которые повлияли на увеличение мажорной версии. Теперь
AbstractJdbcConfiguration
по умолчанию пытается определить Dialect
базы данных из заданного DataSource
или зарегистрированного DialectResolver
. По умолчанию модуль JDBC поставляется с диалектами для H2, HSQLDB, MySQL, Postgres, MariaDB, Microsoft SqlServer и DB2. Spring Data JDBC теперь по умолчанию экранирует все имена таблиц и колонок. Несмотря на то что из-за этого вам, возможно, придется изменить ваши CREATE TABLE
или аннотации @Column
, это даст большую гибкость при именовании объектов.MongoDB
Единый jar с драйверами для MongoDB (mongo-java-driver) разбит на несколько: -sync и -reactivestreams, что позволяет вам выбрать только необходимый драйвер. То есть, и синхронный, и реактивный драйверы MongoDB теперь являются необязательными зависимостями, которые необходимо добавлять вручную. При переходе на новые драйвера некоторые из уже устаревших API были окончательно удалены, что повлияло на классы конфигурации, такие как
AbstractMongoConfiguration
и пространства имен XML, предоставляемые Spring Data. Подробнее смотрите раздел по обновлению в документации.Apache Cassandra
Давно назревшее обновление драйверов Apache Cassandra до 4.0 не только обновляет пакет и структуру данных, но также изменяет поведение в кластере и в обработке сеансов. Это привело к серьезным изменениям в конфигурации, которые влияют на XML-конфигурацию и могут повлиять на конфигурацию в коде для каких-то сложных сценариев (сложнее, чем простая настройка по умолчанию
AbstractCassandraConfiguration
).Couchbase
Вслед за Couchbase SDK мы обновились с версии 3.x до 4.x, что добавило автоматическое управление индексами и поддержку транзакций. Подробнее читайте в блоге Couchbase.
Elasticsearch
Добавлена поддержка HTTP Client API, SSL и Proxy. Также сделан ряд изменений, включающих в себя оптимизацию и удаление устаревшего API, что повлияло на изменение мажорного номера версии. В модуль Elasticsearch теперь входит Document, включающий в себя
Get-
, Index-
и Search-Requests
, что позволяет при маппинге использовать такие типы как SearchHit
, SearchHits
и SearchPage
.Теперь давайте перейдем к новшествам.
Репозитории с поддержкой корутин Kotlin
Релиз Neumann продолжает развитие поддержки корутин Kotlin, начавшуюся в предыдущем релизе Moore, добавив их поддержку в репозиториях.
Корутины поддерживаются через реактивные Spring Data-репозитории. Теперь можно использовать реактивные методы запросов или писать свои suspended-функции.
interface StudentRepository : CoroutineCrudRepository<Student, String> {
suspend fun findOne(id: String): User
fun findByLastname(firstname: String): Flow<Student>
}
@Primary
-репозитории и ключевое слово “search”
Эти два небольших изменения улучшают поиск бинов репозиториев и именование методов запросов. Теперь аннотация
@Primary
на репозиториях-интерфейсах учитывается в конфигурации бинов, что помогает контейнеру резолвить зависимости. Для методов запросов теперь можно использовать префикс "search"
, аналогично "find"
. То есть теперь можно писать методы "search...By..."
, например, searchByFirstname
.Несмотря на то что это было сделано для таких баз данных, как Elasticsearch, давайте двигаться дальше и посмотрим как
search...By...
можно использовать в Spring Data R2DBC.Генерация запросов R2DBC
До настоящего времени в Spring Data R2DBC для методов запросов использовалась аннотация
@Query
за исключением методов по умолчанию, предоставляемых через интерфейсы *.Repository
. Теперь генерация запросов по имени метода работает аналогично другим модулям:interface StudentRepository extends ReactiveCrudRepository<Student, Long> {
Flux<Student> searchByLastname(String lastname); (1)
}
Это эквивалентно:
@Query("select id, firstname, lastname from customer c where c.lastname = :lastname")
Разбивка на страницы и генерация запросов для JDBC
Spring Data JDBC 2.0 поддерживает еще больше реляционных баз данных. Теперь мы запускаем наши интеграционные тесты на H2, HSQLDB, MySQL, MariaDB, PostgreSQL и DB2.
Для этих баз данных мы поддерживаем генерацию запросов и разбивку на страницы. Например:
interface StudentRepository extends PagingAndSortingRepository<Student, Long> {
Page<Student> findByLastname(String lastname);
}
В этом релизе мы также продолжаем двигаться в сторону NoSQL, начав с MongoDB и нового способа модификации документов.
MongoDB Update Aggregations
Это важное изменение (которое не было полностью готово в релизе Moore) позволяет использовать Aggregation Pipeline для обновления данных. Таким образом, изменения могут содержать сложные выражения, такие как условия по значениям полей, например:
AggregationUpdate update = Aggregation.newUpdate()
.set("average").toValue(ArithmeticOperators.valueOf("tests").avg())
.set("grade").toValue(ConditionalOperators.switchCases(
when(valueOf("average").greaterThanEqualToValue(90)).then("A"),
when(valueOf("average").greaterThanEqualToValue(80)).then("B"),
when(valueOf("average").greaterThanEqualToValue(70)).then("C"),
when(valueOf("average").greaterThanEqualToValue(60)).then("D"))
.defaultTo("F")
);
template.update(Student.class)
.apply(update)
.all();
Также Spring Data MongoDB, несомненно, выиграет от недавно добавленной в другие модули поддержки встроенных объектов (embedded object).
Поддержка embedded-типов в Apache Cassandra
Apache Cassandra теперь поддерживает маппинг встроенных типов (embedded type), которые уже давно были доступны в Spring Data JDBC. В модели предметной области встроенные объекты используются для объектов-значений (Value Object), свойства которых хранятся в одной таблице. В следующем примере над полем
Student.name
стоит аннотация @Embedded
, что приводит к тому, что все поля класса Name
будут храниться в таблице Student
, состоящей из трех столбцов (student_id
, firstname
и lastname
):public class Student {
@PrimaryKey("student_id")
private String studentId;
@Embedded(onEmpty = USE_NULL)
Name name;
}
public class Name {
private String firstname;
private String lastname;
}
Аудит в Elasticsearch
Поскольку в ElasticSearch наличие
id
не является достаточным критерием для определения того, является ли объект новым, необходимо при реализации Persistable
предоставить дополнительную информацию с помощью метода isNew()
:@Document(indexName = "person")
public class Person implements Persistable<Long> {
@Id private Long id;
private String lastName;
private String firstName;
@Field(type = Date)
private Instant createdDate;
private String createdBy
@Field(type = Date)
private Instant lastModifiedDate;
private String lastModifiedBy;
@Override
public boolean isNew() {
return id == null || (createdDate == null && createdBy == null);
}
}
После этого добавление
@EnableElasticsearchAuditing
в конфигурацию регистрирует все компоненты, необходимые для аудита.Neo4j
Spring Data Neo4j теперь поддерживает синтаксис запросов Neo4j 4.0 с параметрами. Синтаксис с заполнителями (placeholder) был ранее объявлен устаревшим, а сейчас полностью удален. Теперь модуль зависит от последних версий драйверов Neo4j-OGM и Neo4j Java для улучшения взаимодействия с последней версией Neo4j.
Также идет активная работа по поддержке реактивности для графовых баз данных и ее интеграция в Spring Data с Neo4j RX (хотя это и не входит в текущий релиз, но уже готово для включения в следующий).
Apache Geode / VMware Tanzu GemFire
Модули Spring Data для Apache Geode и VMware Tanzu GemFire (
spring-data-geode
и spring-data-gemfire
) объединены в один проект под общим названием SDG. Apache Geode был обновлен до 1.12.0, а GemFire до 9.10.0, который, в свою очередь, основан на Apache Geode 1.12. Кроме того, SDG компилируется и запускается на версиях JDK с 8 по 14.SDG теперь поддерживает публикацию событий автотранзакций, которая преобразует событие Cache TransactionEvent от GemFire / Geode Cache в соответствующий ApplicationEvent контекста.
Также теперь можно приостановить отправку событий на AEQ, настроенном с помощью SDG. Кроме того, при создании приложений на основе GemFire / Geode Locator с использованием аннотации SDG
@LocatorApplication
можно настроить Locator для подключения к другим Locator, создавая таким образом высокодоступный и устойчивый кластер.Узнать подробно о курсе.