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来实现类似的结果;但是,该机制不适用于 Schema 样式或 @AspectJ 方面。
除了选择特定的 Bean 之外,如果您遵循适当的命名约定,此切点指示符还提供两种有趣的方式来选择 Bean
- 选择 Bean 的垂直切片:如果您遵循一个约定,其中 Bean 名称包含一个表示其业务视角角色的字符串,则 bean() 切点可以根据其业务角色选择 Bean。例如,您可以使用bean(account*) 切点选择所有与会计相关的 Bean,例如accountRepository、accountService 和accountController,如果 Bean 名称以表示其业务功能的字符串开头。
- 选择 Bean 的水平切片:如果您遵循一个约定,其中 Bean 名称包含一个表示其架构视角角色的字符串,则 bean() 切点可以根据其架构角色选择 Bean。例如,您可以使用bean(*Repository) 选择所有存储库 Bean,如果 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 |