版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1基于Spring框架的开发最佳实践目 录 HYPERLINK l _bookmark1 使用 Spring Data 进行 MongoDB 4.0 事务处理 HYPERLINK l _bookmark2 基于Spring Cloud Stream构建和测试 message-driven 微服务 HYPERLINK l _bookmark3 使用JDK11中String类的新方法 HYPERLINK l _bookmark4 24.Spring Data MongoDB 简介 HYPERLINK l _bookmark5 25.Spring Data MongoDB Indexes, Anno
2、tations and Converters HYPERLINK l _bookmark6 26.Spring Data MongoDB 中的查询指南 HYPERLINK l _bookmark0 本周Spring大事件- HYPERLINK l _bookmark7 Spring Data MongoDB中自定义级联 HYPERLINK l _bookmark8 29.Spring Boot 2 容器配置 HYPERLINK l _bookmark9 本周Spring大事件 HYPERLINK l _bookmark10 使用 Spring Boot 后端的 Vue.js 前端Spring
3、Boot 日志 HYPERLINK l _bookmark11 Spring Boot中嵌入式Servlet容器的比较 HYPERLINK l _bookmark12 34.在Spring WebFlux中处理错误 HYPERLINK l _bookmark13 Spring 中 BeanFactory 和 ApplicationContext 的区别 HYPERLINK l _bookmark14 Spring 5 WebFlux入门 HYPERLINK l _bookmark15 37.什么是 Spring Boot? HYPERLINK l _bookmark16 38.Spring v
4、s. Spring Boot:Java框架之间的比较 HYPERLINK l _bookmark17 39.使用 Docker 进行 Spring Boot 开发 HYPERLINK l _bookmark18 40.排名前20的REST和Spring MVC面试题091.201.21 PAGE 45使用 Spring Data 进行 MongoDB 4.0 事务处理在 HYPERLINK /transactions MongoDB 4.0 中,ACID 事务已经用于 D
5、ocument 的存储,强制维护全执行或全不执行的数据一致性状态。所以让我们直接在 synchronous 模型和 reactive 执行模型中验证该特性。在撰写本文时,MongoDB 的多文档事务在单副本集中受支持,并且给用户的感受像是在使用关系型数据库的事务一样。看到驱动程序提供的 API 立刻会感觉到回到家里一样。try (ClientSession session = client.startSession() session.startTransaction();try collection.insertOne(session, documentOne); collection.in
6、sertOne(session, documentTwo); mitTransaction(); catch (Exception e) session.abortTransaction();逻辑会话建立在 MongoDB的基础上,当然,事务,当然还有事务构建了基础。逻辑会话通过帮助跨分布式节点协调操作来为MangoDB的 HYPERLINK /manual/core/read-isolation-consistency-recency/ l causal-consistency 因果一致性和事务建立基础。客户端从 client.startSession() 中获取会话,会话的生命周期不应过长
7、,在不再使用的时候应该立刻关闭它。所以确保使用 close() 来关闭客户端会话。在底层的协议层,上面的代码片段将会转变为如下一系列命令,你可以清楚的发现在每个命令中都包含会话( lsid )。 startTransaction 标志位将会与第一个命令一起发送,表示事务的开始。在事务完成后, 发送 commitTransaction 表示事务的提交。 insert: col, ordered: true, $db: db,$clusterTime: ,lsid: id: $binary: base64 : I3M7Nj, , txnNumber: 1,startTransaction: tru
8、e, documents: insert: col, ordered: true, $db: db,$clusterTime: ,lsid: id: $binary: base64 : I3M7Nj, , txnNumber: 1,autocommit: false, documents: commitTransaction: 1,$db: admin,$clusterTime: ,lsid: id: $binary: base64 : I3M7Nj, , txnNumber: 1 随着即将发布的 Spring Data HYPERLINK /spring-projects/spring-da
9、ta-commons/wiki/Release-Train-Lovelace Lovelace 版本,MongoDB 模块将提供对 synchronous 和 reactive 事务的支持。 HYPERLINK https:/docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html l transaction 我们从 synchronous 模式开始,你可以能已经非常熟悉 Spring 框架对事务的支持 (Spring Frameworks transaction support) 。因此,一个
10、 MongoTransactionManager 的存在并不令人吃惊。该事务管理器是在命令式世界中基于注解的事务支持的入口。现在,因为 MongoDB 在早期版本中不支持事务,你必须明确的在 ApplicationContext 中注册 MongoTransactionManager 。如果你这样做的话, MongoTemplate 将会开始参与管理事务。这是一个你需要记住的要点。下面的例子展示了你应该如何配置事务管理器。Configurationclass Config extends AbstractMongoConfiguration BeanMongoTransactionManage
11、r transactionManager(MongoDbFactory dbFactory) return new MongoTransactionManager(dbFactory);Serviceclass DocumentService private final MongoOperations operations; DocumentService(MongoOperations operations) this.operations = operations;Transactionalvoid insertDocuments() operations.insert(documentO
12、ne); operations.insert(documentTwo);非常直播的操作是吧?但是,这里有一些隐含的缺点。 HYPERLINK /manual/sharding/ l sharded-cluster 集群环境下的事务支持在下一个 MongDB 的release 主要版本中才会支持,因此在您使用时会发生错误。此外,作为一个 MongoDB 的用户,你可能已经习惯了他提供的所有的便利,但一些特性在事务中无法使用了,包括了几乎所有的元命令,创建集合,索引以及受此使用集合时隐式创建集合。为了避免错误和折腾,请务必设置所需的结构。此外, 某些命令可能还会有一些不同。例如使用集合集合统计信息
13、的 count 命令可能在事务中并不准确。命令将会出错并且需要使用聚合计数文档,当前的驱动已经提供一个替代方法 countDocuments 来利用聚合策略解决这个问题。考虑到这一点,让我们继续进行 reactive 使用的部分。在 HYPERLINK https:/mongodb.github.io/mongo-java-driver-reactivestreams/ MongoDB的ReactiveStreams驱动程序 提供了一个反应切入点多文档交易。将本机驱动程序管道 Publisher 化为 HYPERLINK https:/projectreactor.io/ Reactor 类型
14、可让您表达事务用法,如下所示:Mono.from(client.startSession().flatMap(session - session.startTransaction();return Mono.from(collection.insertOne(session, documentOne).then(Mono.from(collection.insertOne(session, documentTwo).onErrorResume(e - Mono.from(session.abortTransaction().then(Mono.error(e).flatMap(val - Mo
15、no.from(mitTransaction().then(Mono.just(val).doFinally(signal - session.close(););不管事务的结果是成功还是回滚,我们都需要保证事务的终止。因此, onErrorResume(.) 保证了事务在失败的时候可以回滚,然后在 flatMap(.) 中提交,这两个阶段都保存了主流 (main flow) 的结果或错误。 不同于 sync 部分,截止撰稿时还没有 reactive 模型可用的事务管理器能够让你通过注解 Transactional 那样简单的完成事务工作。 相反,你需要通过 ReactiveMongoTemp
16、late.inTransaction(.)获取一个 transaction 闭包。它在保持主流 (main flow) 结果的同事负责所有必需的会话,提交和终止操作。回调方法中的操作在MongoDB事务中执行,而外部的处理步骤将不会影响事务。这意味着闭包之外的处理错误不会导致事务终止,就像下面的例子描述的那样。template.inTransaction().execute(action -/ All code in here runs inside the transaction action.insert(documentOne).then(action.insert(documentTw
17、o).flatMap(val - / An exception here does not affect the transaction);在这个例子中,你能够通过流访问到 ClientSession ,它存放在 Reactor 的 Context 中,并且你可以通过 ReactiveMongoContext.getSession() 来获取它。 HYPERLINK /spring-projects/spring-data-examples 最后一件事情:我们非常高兴你能够尝试并且给我们提供一些反馈,所以请查看 Spring Data Examples,您可以在其中找到相关的 HYPERLIN
18、K /spring-projects/spring-data-examples/tree/master/mongodb/transactions 项目 HYPERLINK /spring-projects/spring-data-examples 。如果你想要学习更多有关 Spring Data 或者通用的 Spring eco-system,即将在华盛顿召开的 HYPERLINK https:/springoneplatform.io/ SpringOne Platform 会议对您来说是一个非常好的机会。查看 HYPERLINK https:/springoneplatform.io/20
19、18/sessions 会话并注册。基于Spring Cloud Stream构建和测试 message- driven 微服务Spring Boot和Spring Cloud HYPERLINK /2018/04/26/quick-guide-to-microservices-with-spring-boot-2-0-eureka-and-spring-cloud/ 为您提供了一个利用不同的通信方式快速构建微服务的解决方案。您可以基于Spring Cloud Netflix库创建同步REST微服务,正如我在之前的一篇文章中所展示的那样 使用Spring Boot 2.0, Eureka an
20、d Spring Cloud快速搭建微服务指南。您可以使用Spring WebFlux项目在Netty上创 HYPERLINK /2018/05/04/reactive-microservices-with-spring-webflux-and-spring-cloud/ 建异步的、响应式的微服务,并将其与一些Spring Cloud库相结合,如我的文章所示 使用Spring WebFlux and Spring Cloud搭建响应式微服务。最后,您可以使用Spring Cloud Stream和类似Apache Kafka或RabbitMQ这样的broker来实现基于发布/订阅模型的mess
21、age-driven微服务。构建微服务的最后一种方法是本文的主要主题。我将向您展示如何在RabbitMQ broker的基础上有效地构建、扩展、运行和测试消息传递微服务。体系结构为了演示Spring Cloud Stream的特性,我们将设计一个示例系统,该系统使用发布/订阅模型进行跨服务通信。我们有三个微服务: order-service 、 product-service 和 account-service 。应用程序 order- service 暴露了负责处理发送到我们系统的订单的HTTP endpoint。所有传入的订单都是异步处理的 order-service 准备并发送消息到Ra
22、bbitMQ exchange,然后就对调用的客户端进行响应,不需要等到消息被消费后再响应。应用程序的 account-service 和 product-service 正在侦听进入该RabbitMQ exchange的订单消息。微服务 account-service 负责检查客户账户是否有足够的资金来支付该订单需要的金额,如果有就从该账户扣款。微服务 product-service 检查是否有足够的库存,并在处理订单后改变可用产品的数量。 account-service 和 product-service 都通过RabbitMQ exchange(这一次是使用direct exchange
23、的一对一通信)发送带有操作状态的异步响应。微服务 order-service 根据接收到的响应消息来更新订单状态,并通过REST endpoint GET /order/id 提供给外部客户端。如果您觉得我们的示例描述有点难以理解,这里有一个用于澄清的架构图。启用 Spring Cloud Stream在项目中使用Spring Cloud Stream的推荐方法是使用依赖管理系统。Spring Cloud Stream有一个与整个Spring Cloud framework相关,并且独立发布的依赖管理。然而,如果我们已经在 Elmhurst.RELEASE 版本的 dependencyMana
24、gement 部分声明了 spring-cloud-dependencies ,就不需要在 pom.xml 中声明任何其他内容。如果您喜欢只使用Spring Cloud Stream项目,那么您应该定义以下部分。下一步是将 spring-cloud-stream artifact添加到项目依赖项中。我还建议您至少包括 spring-cloud-sleuth 库,以提供作为源请求进入 order-service 的发送消息用的 traceId 。Spring Cloud Stream 编程模型为了使您的应用程序能够连接到一个message broker,请在主类上使用 EnableBinding
25、 注解。 EnableBinding 注解将一个或多个接口作为参数。您可以在Spring Cloud Stream提供的三个接口之间进行选择:Sink:这是用来标记从入站通道接收消息的服务。Source: 这是用来向出站通道发送消息的。Processor:当你需要一个入站通道和一个出站通道时,它可以被使用,因为它继承了Source and Sink接口。因为order-service发送消息,并接收它们,它的主类已经使用了EnableBinding(Processor.class)order-service注解。下面是项目中启用了Spring Cloud Stream binding的主类。S
26、pringBootApplication EnableBinding(Processor.class) public class OrderApplication .public static void main(String args) new SpringApplicationBuilder(OrderApplication.class).web(true).run(args);.增加 message broker在Spring Cloud Stream术语中,负责与特定message broker集成的实现称为binder。默认情况下, Spring Cloud Stream为 Kafk
27、a and RabbitMQ提供了binder实现。它能够自动检测和在类路径上查找binder。任何特定于中间件的设置都可以通过Spring Boot支持的外部配置属性来覆盖,譬如应用程序参数、环境变量,或者仅仅是 application.yml 文件。为了包含对RabbitMQ的支持,RabbitMQ将这篇文章用作message broker,您应该向项目添加以下依赖项。现在,我们的应用程序需要连接RabbitMQ broker的一个共享实例。这就是为什么我使用RabbitMQ在默认的5672端口上运行Docker镜像。它还可以在地址http:/00:15672(00:15672/)下启动w
28、eb仪表板。我们需要通过设置属性 spring.rabbitmq.host 为Docker机器IP 00 ,来覆盖Spring Boot application的中的默认设置。实现消息驱动的微服务Spring Cloud Stream是在Spring Integration项目之上构建的。Spring Integration扩展了Spring编程模型,以支持众所周知的企业集成模式(EIP)。EIP定义了许多在分布式系统中经常使用的经典组件。您可能已经听说过诸如消息通道、路由器、聚合器或endpoints之类的模式。让我们回到上面的例子。让我们从 order-service 开始,它负责接收订单
29、,将它们发布在shared topic上,然后从下游服务收集异步响应。下面是service,它使用 Source bean来构建消息并将其发布到远程topic。这个 Service 是由controller调用,controller暴露提交新订单和通过 id 获得订单状态的HTTP endpoints。现在,让我们更仔细地看看消费端。来自 order-service 的 OrderSender bean所发送的消息是由 account- service 和 product-service 接收。为了从 topic exchange中接收消息,我们只需要在入参为Order的方法上添加 Strea
30、mListener 注解。我们还必须为监听器定义目标通道在这种情况下,它是 Processor.INPUT 。譬如:StreamListener(Processor.INPUT)public void receiveOrder(Order order) throws JsonProcessingException LOGGER.info(Order received: , mapper.writeValueAsString(order); cess(order);接收订单由 AccountService bean处理。 account-service 会根据客户账户上是否有足够的资金来实现订单
31、接受或拒绝订单。验收状态的响应通过 OrderSender bean调用的输出通道发回 order-service 。最后一步是配置。它是在 application.yml 中提供的。我们必须正确地定义通道的destination。而 order- service 则将 orders-out destination分配给输出通道,而 orders-in destination则是输入通道, account- service 和 product-service 则恰恰相反。这是合乎逻辑的,因为通过其输出destination通过 order- service 发送的消息是通过其输入destina
32、tion接收的服务接收的。但在shared brokers exchange中,它仍然是相同的destination。下面是 order-service 的配置设置。spring:application:name: order-service rabbitmq:host: 00port: 5672 cloud:stream:bindings:output:destination: orders-out producer:partitionKeyExpression: payload.customerId partitionCount: 2input:destination: orders-in
33、 rabbit:bindings:input:consumer: exchangeType: direct这是为 account-service 和 product-service 提供的配置。最后,您可以运行上面示例中的微服务。现在,我们只需要运行每个微服务的单个实例。您可以通过运行JUnit测试类 OrderControllerTest 来轻松地生成一些测试请求,这是在我的源代码库中提供的 order- service 中提供的。这种情况下很简单。在下一篇文章中,我们将学习更高级的示例,其中包含多个正在运行的消费服务实例。扩展为了扩展我们的Spring Cloud Stream应用程序,我
34、们只需要启动每个微服务的附加实例。他们仍然会侦听与当前正在运行的实例相同的 topic exchange 中的传入消息。在添加了一个 account-service 和 product-service 的实例之后,我们可以发送一个测试订单。这个测试的结果对我们来说是不令人满意的 为什么?每个微服务运行的所有实例都接收到了这个订单。这正是 topic exchanges 的工作方式发送到topic的消息被所有的消费者接收,他们正在侦听这个topic。幸运的是,Spring Cloud Stream能够通过提供称为 consumer group的解决方案来解决这个问题。它负责保证一个消息只被一个实
35、例处理,如果它们被放置在一个相互竞争的消费者关系中。在运行多项服务实例时,对consumer group机制的转换已经在下图中可视化了。一个 consumer group 机制的配置不是很困难。我们只需要设定 group 参数,并给出给定destination的组名。下面是 account-service 的当前binding配置。 orders-in destination地是一个为直接与 order- service 通信而创建的队列,因此只有 orders-out 被分组使用 spring.cloud.stream.bindings.group 属性。Consumer group机制是A
36、pache Kafka的一个概念,它也在Spring Cloud Stream中实现,也适用于RabbitMQ broker,它本身并不支持它。因此,我认为它在RabbitMQ上的配置非常有趣。如果您在destination运行两个服务实例,而没有在destination设置组名,那么就会有两个为单个交易所创建的bindings(每个实例一个bindings),如下图所示。因为有两个应用程序在这个exchange中监听,总共有四个binding分配给那个exchange。如果您为选定的destination Spring Cloud Stream设置组名,则将为给定服务的所有运行实例创建单一b
37、inding。binding的名称将以组名为后缀。因为,我们已经在项目依赖项中包含了 spring-cloud-starter-sleuth ,在实现 order-service POST endpoint的单个请求时,在交换的所有异步请求之间发送相同的 traceId 头部。由于这个原因,我们可以使用Elastic Stack (Kibana)轻松地将所有日志关联起来。自动化测试您可以轻松地测试您的微服务,而不需要连接到message broker。要实现它,您需要将 spring-cloud- stream-test-support 包含到您的项目依赖项中。它包含 TestSupportB
38、inder bean,它允许您与绑定通道进行交互,并检查应用程序发送和接收的任何消息。在测试类中,我们需要声明 MessageCollector bean,它负责接收由 TestSupportBinder 保留的消息。这是我的 account-service 测试类。使用 Processor bean,我将测试订单发送到输入通道。然后, MessageCollector 接收到通过输出通道发送回 order-service 的消息。测试方法的 testAccepted 创建了应该被帐户服务接受的顺序,而 testRejected 方法则设置了过高的订单价格,从而导致拒绝订单。总结当您不需要来自
39、API的同步响应时,Message-driven的微服务是一个不错的选择。在本文中,我展示了 在您的微服务之间的跨服务通信中发布/订阅模型的示例用例。源代码在GitHub上是常见的(/helloworldtang/sample-message-driven-microservices.git【原文源码maven不能运行,这个项目fork原代码并修复了错误】)。对于使用Spring Cloud Stream库、Apache Kafka的更有 趣 的 例 子 , 您 可 以 参 考 我 的 书 中 第 11 章 , Mastering Spring Cloud(https:/ HYPERLINK
40、/application-development/mastering-spring-cloud) /application-development/mastering-spring-cloud)。使用JDK11中String类的新方法在 HYPERLINK /2018/05/jdk-11-string-methods.html JDK11中String的新方法和 HYPERLINK /2018/02/string-repeat-coming-to-java.html java带来了String的repeat方法两篇文章中,我讨论了 HYPERLINK /projects/jdk/11/ JDK
41、11中 HYPERLINK /javase/10/docs/api/java/lang/String.html java String的六个新方法。目前已经可用的 HYPERLINK /11/ early access JDK 11 builds版本已经包括了这些新的方法。 HYPERLINK /jdk/jdk/log?revcount=10000&rev=reverse(%22jdk-11%2B19%22%3A%3A%22jdk-11%2B20%22 在这篇文章中,我将要给大家演示如何使用这些新的方法。在下面的例子中,我使用了OpenJDK JDK 11 Early Access Build
42、 20)这个版本来编译和运行代码。在OpenJDK JDK 11 Early Access Build 20这个版本中新加入的六个方法分别是:String.repeat(int) String.lines() String.strip() String.stripLeading() String.stripTrailing() String.isBlank()这些示例的源码已经放在git上:示例源码String.repeat(int)因为我之前在groovy中曾使用过这个方法提供的功能,因此String.repeat(int)方法终于提供了我一直想在java中看到的便捷功能。正如方法名字一样,
43、这个方法会按照参数int提供的次数来重复字符串。我将会使用这个方法来生成更多的简单的示例,并且也用这个方法来演示这篇文章中的例子。下面的代码演示了通过String.repeat(int)方法来生成并输出header separater。String.repeat(int)示例/*Write provided code String in header. Note that thisimplementation uses code String.repeat(int).*param headerText Title of header.*/private static void writeHea
44、der(final String headerText)final String headerSeparator = =.repeat(headerText.length()+4); out.println(n + headerSeparator);out.println(= + headerText + =); out.println(headerSeparator);writeHeader(String)方法使用String.repeat(int)就能很容易地通过=来生成header separater,从而能盖住headerText的内容。它额外添加了4个=,因为headerText前后
45、各加了一个=和一个空格。在这篇文章中,writeHeader(String)方法将会被用在其他示例中,同时也在其他示例中被用来展示其功能。String.lines()String.lines() 方法通过换行符把字符串分开,并返回一个字符串流,并且该字符串流也是根据换行符来分隔的。String.lines()示例/* Demonstrate method code String.lines() added with JDK 11.*/public static void demonstrateStringLines()final String originalString = prepareS
46、tringWithLineTerminators(); final String stringWithoutLineSeparators= originalString.replaceAll(n, n); writeHeader(String.lines() on + stringWithoutLineSeparators + ); final Stream strings = originalString.lines(); strings.forEach(out:println);上面的代码输出结果如下:String.strip()/String.stripLeading()/String.
47、stripTrailing()String.strip(), String.stripLeading()和String.stripTrailing()方法的作用是分别去掉了字符串头和尾的空白符,字符串头的空白符,字符串尾的空白符(空白符如Character.isWhiteSpace(int)方法结果验证)。String.strip/String.stripLeading()/String.stripTrailing()示例/* Demonstrate method code String.strip() added with JDK 11.*/public static void demons
48、trateStringStrip()final String originalString = prepareStringSurroundedBySpaces(); writeHeader(String.strip() on + originalString + ); out.println( + originalString.strip() + );/* Demonstrate method code String.stripLeading() added with JDK 11.*/public static void demonstrateStringStripLeading()fina
49、l String originalString = prepareStringSurroundedBySpaces(); writeHeader(String.stripLeading() on + originalString + ); out.println( + originalString.stripLeading() + );/* Demonstrate method code String.stripTrailing() added with JDK 11.*/public static void demonstrateStringStripTrailing()final Stri
50、ng originalString = prepareStringSurroundedBySpaces(); writeHeader(String.stripTrailing() on + originalString + ); out.println( + originalString.stripTrailing() + );上面的代码执行结果如下所示:String.isBlank()String.isBlank()方法用来验证当前字符串是否是空的, 或者是否只包括空白字符(空白字符由Character.isWhiteSpace(int)来验证)/* Demonstrate method c
51、ode String.isBlank() added with JDK 11.*/public static void demonstrateStringIsBlank()writeHeader(String.isBlank(); final String emptyString = ;out.println(Empty String - + emptyString.isBlank();final String onlyLineSeparator = System.getProperty(line.separator); out.println(Line Separator Only - +
52、onlyLineSeparator.isBlank(); final String tabOnly = t;out.println(Tab Only - + tabOnly.isBlank(); final String spacesOnly = ;out.println(Spaces Only - + spacesOnly.isBlank();代码执行结果如下所示:上面示例中有些方法没有直接在代码中展示,详情可以查看GitHub上面的方法添加到JDK 11中是对String类的一些小补充,但是却让String一些展示性的功能更加容易,也减少了对第三方库包的依赖。Spring Data Mon
53、goDB 简介概述本文将对进行快速实用的 Spring Data MongoDB 介绍。我们将使用 MongoTemplate 和 MongoRepository 的基础知识来实际测试说明每个操作。MongoTemplate 和 MongoRepositoryMongoTemplate 遵循 Spring 的标准模板模式,并提供一个到底层持久化引擎的准备好的、基础的API。repository 遵循 Spring 以数据为中心的理念,并基于所有 Spring Data 项目中众所周知的访问模式, 提供更灵活、更复杂的 API 操作。对于这两者,我们需要首先定义依赖项举个例子,在 pom.xml
54、 中,使用 Maven:org.springframework.dataspring-data-mongodb1.10.4.RELEASE要检查是否有任何新版本的库发布,请 HYPERLINK / l search%7Cgav%7C1%7Cg%3A%22org.springframework.data%22%20AND%20a%3A%22spring-data-mongodb%22 在此处追踪版本。MongoTemplate 的配置XML 配置让我们从 MongoTemplate 的简单 XML 配置开始:首先,我们需要定义负责创建 Mongo 实例的工厂 bean。接下来,我们需要实际定义(
55、和配置)模板 bean:最后,我们需要定义翻译任何被 Repository 注解的类中抛出的 MongoExceptions 的后置处理器:Java 配置现在让我们使用 Java 通过继承 MongoDB 配置的基类 AbstractMongoConfiguration 来创建一个类似的配置:Configurationpublic class MongoConfig extends AbstractMongoConfiguration Overrideprotected String getDatabaseName() return test;Overridepublic Mongo mong
56、o() throws Exception return new MongoClient(, 27017);Overrideprotected String getMappingBasePackage() return org.baeldung;注意:我们不需要在前面的配置中定义 MongoTemplate bean,因为它已经在AbstractMongoConfiguration 中定义好了。我们也可以从零开始使用我们配置而不继承 AbstractMongoConfiguration,如下所示:Configurationpublic class SimpleMongoConfig Beanpu
57、blic Mongo mongo() throws Exception return new MongoClient(localhost);Beanpublic MongoTemplate mongoTemplate() throws Exception return new MongoTemplate(mongo(), test);MongoRepository 的配置XML 配置要使用自定义 repositories(继承自 MongoRepository),我们需要继续 3.1 节的配置并设置存储库。Java 配置相同的,我们将在 3.2 节船舰的配置的基础上在混合时添加一个新的注解:E
58、nableMongoRepositories(basePackages = org.baeldung.repository)创建 Repository现在,在配置之后,我们需要创建一个 repository,继承现有的 MongoRepository 接口:public interface UserRepository extends MongoRepository /现在我们可以自动连接此 UserRepository 并使用 MongoRepository 中的操作或添加自定义操作。使用 MongoTemplateInsert让我们从插入操作开始;我们也从一个空数据库开始:现在,如果我们插
59、入一个新用户:User user = new User(); user.setName(Jon); mongoTemplate.insert(user, user);数据库将如下所示:_id : ObjectId(55b4fda5830b550a8c2ca25a), _class : org.baeldung.model.User,name : JonSave插入在 保存 操作有保存或更新语义:如果 ID 存在,它执行更新,如果没有,它将执行插入。让我们看第一种语义插入;这是数据库的初始状态:我们现在保存新用户时:User user = new User(); user.setName(Alb
60、ert); mongoTemplate.save(user, user);该实体将被保存进数据库:_id : ObjectId(55b52bb7830b8c9b544b6ad5), _class : org.baeldung.model.User,name : Albert接下来,我们将查看相同的操作 save,使用其更新语义。Save更新现在让我们查看使用更新语义的 save,对现有实体进行操作:_id : ObjectId(55b52bb7830b8c9b544b6ad5), _class : org.baeldung.model.User,name : Jack现在,当我们 save 现
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 体育用品销售员工作总结
- 零售批发行业美工工作总结
- 2025年度医院双拥工作计划范文
- 人教版历史与社会七年级下册说课稿综合探究七 区域的变化
- 知识竞赛活动安排计划
- 儿科护士年终总结
- 金融贷款销售经理销售业绩总结
- 2024-2025学年济宁市高三数学上学期期末质检试卷附答案解析
- 人教版《历史与社会》八年级上册(新)同步说课稿:第3单元第1课《秦始皇开创大一统基业》
- 被迫解除劳动合同 失业金理由
- 举办活动的申请书范文
- 瑶医目诊图-望面诊病现用图解-目诊
- 2022年四级反射疗法师考试题库(含答案)
- 新《安全生产法》培训测试题
- 政务礼仪-PPT课件
- 特种涂料类型——耐核辐射涂料的研究
- 化工装置常用英语词汇对照
- 物资采购管理流程图
- 无牙颌解剖标志
- 标准《大跨径混凝土桥梁的试验方法》
- 格拉斯哥昏迷评分(GCS)--表格-改良自用
评论
0/150
提交评论