Ramnivas Laddad
以编程方式使用 Spring Cloud
在上一篇博客中,我向您展示了如何使用Spring Cloud的 Java 配置选项以声明方式获取服务连接器(如果您需要,还支持 XML 命名空间)。在本博客中,我们将仔细研究如何以编程方式使用 Spring Cloud。这将有助于在无法使用 Java 或 XML 配置的情况下。它还将揭示 Spring Cloud 的工作原理,并为本系列的下一篇博客做准备,我们将在其中讨论扩展 Spring Cloud。
要使用 Spring Cloud,我们需要访问 Cloud 类的对象。但是,您不能直接创建 Cloud 对象(它的构造函数不是公共的)。相反,您将通过 CloudFactory 获取它...
Spring Cloud 简介
开发、部署和操作云应用程序应该像本地应用程序一样容易(甚至更容易)。这是并且应该成为任何云平台、库或工具的指导原则。Spring Cloud——一个开源库——使得为云开发 JVM 应用程序变得容易。有了它,应用程序可以轻松地连接到服务并发现多个云(如 Cloud Foundry 和 Heroku)中的云环境信息。此外,您可以将其扩展到其他云平台和新服务。
在本系列的第一篇博客中,我将介绍 Spring Cloud,并从应用程序开发人员的角度展示其用法。我们将开发一个简单的应用程序并部署到Cloud Foundry和Heroku...
将 Cloud Foundry 服务与 Spring 结合使用:第 2 部分 - 自动重新配置
如果您观看了Cloud Foundry 启动活动的视频,您会看到我们部署了从 Spring Web Flow 示例下载的 Spring Travel 应用程序,为其绑定了一个 MySQL 服务,并将应用程序拖放到 STS 中的 Cloud Foundry 服务器,而无需对应用程序本身进行任何更改。应用程序配置为使用本地数据库,这怎么可能呢?这就是自动重新配置发挥作用的时候。
Cloud Foundry 致力于降低您的初始投资。除了金钱之外,真正的投资来自于开发人员的时间...
将 Cloud Foundry 服务与 Spring 结合使用:第 1 部分 - 基础知识
Cloud Foundry 提供的服务使得编写高效且有效的应用程序成为可能。开发人员现在可以选择最合适的服务,而无需担心操作这些服务。例如,应用程序的一部分可以选择 Postgres 用于事务访问至关重要的部分,MongoDB 用于将数据作为文档集合进行交互有意义的部分,Redis 用于键值是正确抽象的部分,以及 RabbitMQ 用于消息传递有助于创建有效架构的部分。在这个由四部分组成的博客系列中,我们将探讨 Spring 应用程序如何使用 Cloud Foundry...
领域对象依赖注入功能的新改进
Spring 的依赖注入 (DI) 机制允许配置应用程序上下文中定义的 bean。如果您想将相同的思想扩展到非 bean 呢?Spring 对领域对象 DI 的支持利用 AspectJ 织入将 DI 扩展到任何对象,即使它是由 Web 或 ORM 框架创建的。这使得创建具有丰富领域行为的对象成为可能,因为领域对象现在可以与注入的对象协作。在本博客中,我将讨论 Spring 框架在此领域的最新改进。
领域对象 DI 背后的核心思想非常简单:一个 AspectJ 织入切面选择与任何符合特定规范的对象的创建或反序列化对应的连接点。对这些连接点的通知将依赖项注入到正在创建或反序列化的对象中。当然,魔鬼在细节中。例如,如何选择与反序列化对应的连接点,或者如何每个对象只注入一次依赖项?通过提供一些预先编写的...
新的 bean() 切入点
Spring 2.5 引入了一个新的切入点指示符——bean(),它允许选择名称模式匹配的 bean 中的连接点。现在可以使用自动代理机制以及 Spring-AspectJ 集成来选择特定的 bean,即使存在多个相同类型的 bean。之前,您可以使用 BeanNameAutoProxyCreator 实现类似的结果;但是,该机制不适用于模式样式或 @AspectJ 切面。
除了选择特定的 bean,如果遵循适当的命名约定,这个切入点指示符还提供了两种有趣的方式来选择 bean
- 选择 bean 的垂直切片:如果您遵循 bean 名称包含指示其业务角色字符串的约定,则 bean() 切入点可以根据其业务角色选择 bean。例如,如果您遵循 bean 名称以表示其业务功能的字符串开头的约定,则可以使用 bean(account*) 切入点选择所有与会计相关的 bean,例如 accountRepository、accountService 和 accountController。
- 选择 bean 的水平切片:如果您遵循 bean 名称包含指示其架构角色字符串的约定,则 bean() 切入点可以根据其架构角色选择 bean。例如,如果您遵循 bean 名称以表示其架构角色的字符串结尾的约定,则可以使用 bean(*Repository) 选择所有存储库 bean。如果没有 bean() 切入点,您必须依赖包结构或基于类型的切入点,这有时可能有点过于严格。
图 1:使用 bean() 切入点根据 bean 名称选择 bean 的水平和垂直切片
此切入点代表 AspectJ 切入点表达式语言的 Spring 特定扩展,因此仅在基于 Spring 的应用程序中有用。名称模式遵循 AspectJ 的名称模式匹配规则,其中 '*' 是唯一允许的通配符。下表显示了一些示例切入点及其选择的 bean。| 切入点 | 选择的连接点 |
|---|---|
| bean(accountRepository) | 名为“accountRepository”的 bean |
| !bean(accountRepository) | 除“accountRepository”bean 之外的任何 bean |
| bean(*) | 任何 bean |
| bean(account*) | 名称以“account”开头的任何 bean |
| bean(*Repository) | 名称以“Repository”结尾的任何 bean |
| bean(accounting/showaccount) | 名为 accounting/showaccount 的 bean(例如,指定处理该 URL 的控制器) |
| bean(accounting/*) | 名称以“accounting/”开头的任何 bean(例如,指定处理与会计相关的 URL 的任何控制器) |
| bean(accounting/*/edit) | 名称以“accounting/”开头并以“/edit”结尾的任何 bean(例如,指定处理与会计相关的编辑操作功能的任何控制器) |
| bean(*dataSource) || bean(*DataSource) | 名称以“dataSource”或“DataSource”结尾的任何 bean |
| bean(service:name=monitoring) | 名为“service:name=monitoring”的 bean |