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……
使用 Spring 和 Cloud Foundry 服务:第二部分 - 自动重新配置
如果您观看了Cloud Foundry 发布会的视频,您会看到我们部署了从 Spring Web Flow 示例下载的 Spring Travel 应用程序,将 MySQL 服务绑定到它,然后将应用程序拖放到 STS 中的 Cloud Foundry 服务器,而无需对应用程序本身进行任何修改。由于应用程序配置为使用本地数据库,这怎么可能呢?这就是自动重新配置发挥作用的时候。
Cloud Foundry 致力于降低您的初始投资。除了金钱之外,真正的投资来自于开发者花费的时间……
使用 Spring 和 Cloud Foundry 服务:第一部分 - 基础知识
Cloud Foundry 提供的服务使得编写高效且实用的应用程序成为可能。开发者现在可以自由选择合适的各类服务,而无需担心其运维。例如,应用程序的一部分可以选择 Postgres 用于事务访问至关重要的部分,MongoDB 用于将数据作为文档集合进行交互有意义的部分,Redis 用于键值是正确抽象的部分,以及 RabbitMQ 用于消息传递有助于创建有效架构的部分。在这个由四部分组成的博客系列中,我们将探讨 Spring 应用程序如何使用 Cloud Foundry……
领域对象依赖注入特性新改进
Spring 的依赖注入(DI)机制允许配置应用程序上下文中定义的 bean。如果您想将相同的想法扩展到非 bean 对象怎么办?Spring 对 领域对象 DI 的支持利用 AspectJ 织入(weaving)将 DI 扩展到任何对象,即使它是由 Web 或 ORM 框架创建的。这使得创建具有丰富领域行为的对象成为可能,因为领域对象现在可以与注入的对象协作。在本篇博客中,我将讨论 Spring Framework 在这一领域的最新改进。
领域对象 DI 背后的核心思想非常简单:一个通过 AspectJ 织入的切面(aspect)选择与任何符合特定规范的对象的创建或反序列化相对应的连接点(join point)。对这些连接点的通知(advice)会将依赖项注入到正在创建或反序列化的对象中。当然,细节决定成败。例如,如何选择与反序列化相对应的连接点,或者如何确保每个对象只注入一次依赖项?通过提供一些预先编写的……
新的 bean() 切入点
Spring 2.5 提供了一个新的切入点指示符 -- bean(),它允许选择与名称模式匹配的 bean 中的连接点。现在,即使存在多个同类型的 bean,也可以结合自动代理机制和 Spring-AspectJ 集成来选择特定的 bean。以前,您可以使用 BeanNameAutoProxyCreator 来实现类似的结果;但是,该机制不适用于 Schema 风格或 @AspectJ 的切面。
除了选择特定的 bean 之外,如果您遵循合适的命名约定,此切入点指示符还提供了两种有趣的方式来选择 bean
- 选择 bean 的垂直切片: 如果您遵循一种约定,bean 名称包含一个字符串,该字符串从业务角度指示其角色,则 bean() 切入点可以根据其业务角色选择 bean。例如,如果 bean 名称以表示其业务功能的字符串开头,您可以使用 bean(account*) 切入点来选择所有与会计相关的 bean,例如 accountRepository、accountService 和 accountController。
- 选择 bean 的水平切片: 如果您遵循一种约定,bean 名称包含一个字符串,该字符串从架构角度指示其角色,则 bean() 切入点可以根据其架构角色选择 bean。例如,如果 bean 名称以表示其架构角色的字符串结尾,您可以使用 bean(*Repository) 来选择所有 Repository bean。如果没有 bean() 切入点,您必须依赖包结构或基于类型的切入点,这有时可能会有点过于受限。

图 1:使用 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 |