本文共 2850 字,大约阅读时间需要 9 分钟。
Pivotal最近下一代Spring Data项目的第一个里程碑版本,他们将其称之为。在发布文档中,这样写到:
\\\\\这是一个特殊的释放版本,会带领我们驶往新一代的Spring Data,在前行的过程中也会包含几项破坏性的变更。
\
重要的变更包括:
\\选择MongoDB、Cassandra和Redis的原因在于它们具有实现反应式数据访问的可用驱动。针对这三种数据库,都包含了面向和的Spring Data repository接口。
\\为了准备Spring Data反应式访问MongoDB的样例,我们考虑如下的POJO:
\\\ public class Person {\ private @Id String id;\ private final String firstname;\ private final String lastname;\ }\\
使用Reactor项目的基本反应式repository接口可以写成如下所示的样子:
\\\ public interface ReactivePersonRepository extends ReactiveCrudRepository\u0026lt;Person,String\u0026gt; {\ Flux\u0026lt;Person\u0026gt; findByLastname(String lastname);\\ @Query(\"{ 'firstname': ?0, 'lastname': ?1}\")\ Mono\u0026lt;Person\u0026gt; findByFirstnameAndLastname(String firstname,String lastname);\\ Flux\u0026lt;Person\u0026gt; findByLastname(Mono\u0026lt;String\u0026gt; lastname);\ }\\
这里使用了反应式的类,也就是和
\\正如最近InfoQ上的:
\\\\\Flux类似RxJava的,它可以触发零或多个事件,并根据实际情况结束处理或触发错误。
\\而Mono最多只触发一个事件,它对应于RxJava的和,所以可以将
\Mono\u0026lt;Void\u0026gt;
用于在异步任务完成时发出通知。
类似的,使用RxJava的基础反应式repository接口可以写成如下所示的样子:
\\\ public interface RxJava1PersonRepository extends RxJava1CrudRepository\u0026lt;Person,String\u0026gt; {\ Observable\u0026lt;Person\u0026gt; findByLastname(String lastname);\\ @Query(\"{ 'firstname': ?0, 'lastname': ?1}\")\ Single\u0026lt;Person\u0026gt; findByFirstnameAndLastname(String firstname,String lastname);\\ Observable\u0026lt;Person\u0026gt; findByLastname(Single\u0026lt;String\u0026gt; lastname);\ }\\
激活Spring Data反应式repository是通过注解完成的,也就是@EnableReactiveMongoRepositories
和@EnableCassandraRepositories
,下面展示了MongoDB的样例:
\@EnableReactiveMongoRepositories\@AutoConfigreAfter(EmbeddedMongoAutoConfiguration.class)\class ApplicationConfiguration extended AbstractReactiveMongoConfiguration {\\ @Bean\ public LoggingEventListener mongoEventListener() {\ return new LoggingEventListener();\ }\\ @Override\ @Bean\ public MongoClient mongoClient() {\ return MongoClients.create();\ }\\ @Override\ protected String getDatabaseName() {\ return \"reactive\";\ }\ }\\
类似于构建传统数据操作的模板,反应式模板也可以写成如下所示:
\\\ public interface ReactiveMongoOperations {\ // 其他操作……\ \u0026lt;T\u0026gt; Mono\u0026lt;T\u0026gt; findOne(Query query,Class\u0026lt;T\u0026gt; entityClass);\ \u0026lt;T\u0026gt; Flux\u0026lt;T\u0026gt; find(Query query,Class\u0026lt;T\u0026gt; entityClass);\ \u0026lt;T\u0026gt; Mono\u0026lt;T\u0026gt; insert(T objectToSave,String collectionName);\ \u0026lt;T\u0026gt; Mono\u0026lt;T\u0026gt; insert(Mono\u0026lt;? extends T\u0026gt; objectToSave);\ }\\
数据同样可以通过模板进行插入:
\\\ Flux\u0026lt;Person\u0026gt; flux = Flux.just(new Person(\"Vincent\
转载地址:http://jebeo.baihongyu.com/