您最近见过春天吗?

开源应用程序框架Spring昨天与4.0版本一起发布 被称为“保持现代Java开发的最前沿的Spring”的开发,经过改进的平台在设计时牢记了即将到来的Java 8。 在11月的《 JAX Magazine》中 ,Spring开发倡导者Josh Long写了一篇有针对性的文章,以了解Spring的新功能-鉴于本周的发展,我们认为这是共享它的绝佳时机。

2013年是Spring的标志性一年! 4月,我们Spring团队加入了Pivotal计划,我们并不孤单! 新公司由Spring(包括Grails,RabbitMQ,Tomcat,Redis和GemFire团队),Cloud Foundry(开源PaaS(平台即服务)和Greenplum(在智能数据仓库和管理方面具有领导地位)组成Hadoop等)。

如今,要求开发人员处理比以往更多的挑战,并更快地处理。 赶上当今的技术,尤其是考虑到围绕大数据,云计算,移动和Web开发的不断创新,这可能是一项令人头晕的任务,但是Spring(和Pivotal(@gopivotal))支持您!我们称之为Spring IO的更大平台。

在本文(最初在JAX Magazine中发表)中,我们将介绍最新和最出色的Spring项目及其在Spring IO平台中的位置。

  虽然您可以选择任何库并按需使用,但我们希望开发人员将通过IO执行层的三种技术之一进入该平台。 IO执行层描述了所有管理最终体现为操作系统进程的事物。 IO执行层当前包括:

  • Spring XD 用于大数据,批处理和集成工作

  • Spring Boot 用于以配置约定为中心和以焦点为奇点的Spring应用程序开发。

  • Grails的 快速Web应用开发与Groovy语言。

从那里开始,开发人员可能希望使用IO Foundation层中的任何Spring模块,这些模块支持集成,批处理,大数据和Web应用程序,所有这些模块均与我们的数据访问和处理API一起使用,并享受跨平台的支持。削减技术,例如核心依赖项注入容器,反应式 Reactor 框架和 Spring Security 框架。

让我们看一下Spring简化的一些事情。

春天为您和您的新起点: 春天有了新家!

Spring在Web上的新家是 http://spring.io 。 Spring.io是您的一站式商店,提供 文档论坛博客 ,详细的 项目信息 以及新 的入门指南 和教程。 每周我们都会在博客上发布很多很棒的技术内容。 每个星期二,我都会发布一个名为“本周Spring”的帖子,其中汇总了我们团队和Spring社区的出色博客,教程和视频。

“如何快速入门?”
我们在Spring团队中一直在努力回答以下问题:“如何快速入门?” 我们已经开发了一个两管齐下的解决方案:更好的指导/教育和默认生产工具。  

(更多)源头指导

Spring总是有一个很好的文档故事。 即使其他人都在出售,Spring总是会放弃源代码和文档。 Spring本身最初是书页中给出的示例代码,为企业Java规定了一种更好的前进方式。 随着Spring努力满足不断发展的技术视野,这种前进的方式使我们从最初的几个步骤中走了越来越远。 很容易忘记前几个步骤的样子。

我们重新审视了“入门”经验,并创建了以任务为中心 的入门指南 ,这些 指南 以简短的文字说明了如何完成任务,您应该可以在午餐时间(或更少!)进行操作。 每本指南均以您可以对照其完成的工作代码库开头,并以空白的入门代码库进行水平设置和重新开始。

假设您已经听说过 REST, 并希望将其合并到您的应用程序中。 只需查看 由Spring团队的专家撰写 的《 构建RESTful Web服务》 指南即可。 如果愿意,您可以跳到最重要的位置,然后您将获得可以使用的工作代码。 要获得更丰富的叙述,只需遵循指南即可!

使用Spring Boot提升您的生产力!  

这些指南尽可能使用 Spring Boot 编写 。 通过Spring Boot,可以轻松地创建独立的,基于生产级别的基于Spring的应用程序,您可以“仅运行”它们。 Spring Boot对Spring平台和第三方库采用了经过公认为的,基于约定的配置视图,因此您可以以最小的麻烦开始使用。 它将注意力集中在您的应用程序上,而不是概念上的开销。

要尝试吗? 安装spring命令行工具 (可以 在OSX上 使用 GVMHomebrew ,或简单地构建代码),然后将以下内容放入名为service.groovy的文件中:

@Grab("spring-boot-starter-actuator")
@RestController
class Example {

    @RequestMapping("/")
    String home() {
        [message: 'Hello World']
    }
}

这是Groovy语言的Spring MVC REST控制器,它仅返回带有属性message的对象。 在命令行上,运行spring run service.groovy,它将启动并为您提供一个有效的REST端点,您可以从 http://127.0.0.1:8080/上的 任何浏览器访问该端点 。 @Grab注释告诉Groovy下拉Java依赖项(例如,您可能对Maven或Gradle所做的事情),Spring Boot项目提供了完成给定任务所需的所有库的完整信息。


使用我们的开源和基于Eclipse的Spring Tool Suite和Groovy Tool Suite引导您的开发

如果您是在Eclipse中工作的Java开发人员,请查看我们基于Eclipse的开源 Spring工具套件Groovy / Grails工具套件 发行版。 它们位于最新和最新的Eclipse发行版的现有实例之上,或者您可以将它们下载为单独的IDE。 我认为这最后一种方法是更有生产力的方法,如果您还有其他需要,只需添加它即可!

弹簧

处理数据

Spring提供了一组处理数据的丰富技术。

传统RDMBS

Spring核心框架对JDBC和基于JDBC的ORM访问提供了强大的支持。 它包含一个事务API,使您与SQL数据库,JMS和AMQP消息代理以及JPA / Hibernate ORM客户端等事务资源典型的(不兼容)细微差别隔离。 Spring在这里的支持已经具有传奇色彩,并且Java 8的开发人员预览版已经可用,变得更加富有表现力! 下面是一个将Java 8的lambda表达式与Spring的JdbcTemplate结合使用的示例,Spring的JdbcTemplate是JDBC驱动的数据访问的主要工具:

User user = jdbcTemplate.queryForObject( 
      "select * from USERS where ID = ?" ,  
       (resultSet, rowNum ) -> new User( resultSet.getLong("ID"), resultSet.getString("EMAIL")),
       423L ) ;

使用Spring Data的NoSQL,NewSQL和NOSQL

春天数据 项目拥抱所谓的新品种 的NoSQL, NewSQL,或NOSQL(不是只-SQL)解决方案。 Spring Data并不是一个统辖所有API的API,而是一个伞形项目,其中包含针对 Redis, MongoDBNeo4J 等流行“数据库”技术的特定API 此外,项目有许多第三方绑定,例如ElasticSearch,SOLR,CouchDB和Riak。

存储库的概念是 许多Spring Data模块(包括 Spring Data JPA 模块)共有的概念。 Spring Data存储库以存储库设计模式命名,是Spring Data在运行时使用约定优于配置来实现的接口,通常通过与某些后端资源进行交互来动态构建实现。 这是一个Spring Data JPA存储库,我可以在代码中的任何地方注入和使用它。 我在注释中添加了每种方法生成的查询的粗略示例。

@RestResource (path = "users", rel = "users")  // automatically exposes a REST endpoint at /users/*
public interface UserRepository extends PagingAndSortingRepository<User, Long> {

    // select * from users where username = ?
    User findByUsername(@Param("username") String username); 

    // select * from users where firstName =? or lastName = ? or username = ?
    List<User> findUsersByFirstNameOrLastNameOrUsername(
      @Param("firstName") String firstName,
      @Param("lastName") String lastName,
      @Param("username") String username);

}

在这种情况下,我使用了Spring Data JPA的存储库支持,但是我可以像使用Spring Data MongoDB,Spring Data Neo4j或Spring Data GemFire一样容易,并且那些查询方法将映射到那些后端数据库,而不是SQL。 。 还要注意,Spring Data REST提供了@RestResource批注。 该注释透明地将存储库映射到RESTful服务端点,并与Spring MVC结合使用。

对于单个Java接口来说,这还不是太简陋!

使用Spring在Apache Hadoop上生存大数据狂野西部

当今的Hadoop生态系统代表着一些非常熟悉的问题,提供了绝佳的新机会。 回想一下2003年– Spring是新出现的事物–十年前设法成为Hibernate,Quartz和Struts在同一个Web应用程序中工作的开发人员是办公室的摇滚明星!

这些项目是由彼此互不相关的用例和标准的单个开源项目隔离开发的:它们不共享公共的运行时概念,也不共享诸如事务管理之类的公共API概念。 在当今世界中,由于使用了Spring,因此在同一应用程序中使用Hibernate和Struts(或Spring MVC)和Quartz变得很容易。

在当今的Hadoop生态系统中,我们发现自己面临同样的集成挑战,Spring在这里再次提供了解决方案。 用于Apache Hadoop的Spring 使在标准Spring内尽可能轻松地使用诸如HBase,Hive,Pig,Cascading和YARN之类的Hadoop生态系统技术。 此外,用于Apache Hadoop的Spring可以依靠平台(如属性占位符解析)来简化配置。

已知用于Apache Hadoop的Spring可与以下Hadoop发行版一起使用:

  • Apache Hadoop 1.2.1稳定

  • Apache Hadoop 2.0.6版

  • Apache Hadoop 2.1.0-测试版

  • Cloudera CDH4

  • Hortonworks HDP 1.3

Pivotal HD 1.0 –这是 @GoPivotal Hadoop发行版。 它包括针对企业级Hadoop的全球首个真正的SQL处理,基于Hadoop 2构建,并由EMC的全球24×7支持基础架构提供支持,并且可以作为单独的,易于使用的 单节点虚拟机使用。为发展

要了解有关Spring for Apache Hadoop的更多信息,请查看以下资源:

在线和批量处理数据

Spring清楚地知道如何与您可能最感兴趣的数据源进行通信。 当然,下一个问题是如何处理这些数据存储中的数据。 Spring集成和数据处理解决方案非常丰富。

Spring集成以构建消息驱动的体系结构

Spring Integration 是一个集成框架,采用了Gregor Hohpe和Bobby Woolf的史诗集《企业集成模式》中的模式样式。 在企业集成领域中,系统通过渠道(消息队列)连接。

消息从一个组件流到另一个组件,后者可以转换,丰富,拆分,聚合和路由消息。 Spring Integration提供了一组适配器,这些适配器可将来自外部系统的消息适配为标准的Spring Integration消息。 通过这种方式,Spring Integration应用程序可以集成来自不同系统和协议的数据和服务,例如FTPS,XMPP,JDBC,SFTP,Hadoop的HDFS,Twitter,Splunk,JDBC,JMS,AMQP,Twitter和GemFire连续查询。


使用Spring Batch进行批处理以避免计算资源闲置

Spring Integration就是实时响应事件,能够与来自不同系统的数据和服务集成。 Spring Batch涉及安全处理大量顺序数据,例如平面文件,JDBC数据库或大型XML文档中的大型数据集。 在 Batch JSR中 , 它的设计也基本完好无损 ,在这里,我们做出了很多领导,使之成为社区的最佳标准。 作为规范,JSR 352在某些方面一定是含糊的。 特别是,它没有开箱即用地规定任何项目读取器和写入器。 通过Spring Batch实现访问JSR的用户将欣赏Spring Batch特有的丰富的读写器集。

Spring Batch作业包含一个或多个步骤的序列。 每个步骤可以有选择地读取(通过其提供的ItemReader),可选地进行处理(通过提供的ItemProcessor)和可选地写入(通过提供的ItemWriter)。

这是一个使用Spring Integration响应新文件系统事件(“受监视的文件夹中有新文件”),然后使用Spring Batch处理文件的示例。 该代码可在下面的资源中找到。

弹簧

有关使用Spring Batch和Spring Integration的更多资源:

使用Spring XD冲浪潮汐数据

当今的应用程序是实时的,并且可以处理大量数据。 设置Hadoop集群以处理批处理和仓储是一回事,但是当今许多开发人员都在为另一个问题苦苦挣扎:我如何足够快地吸收数据负载,以便首先将其放入Hadoop? 这一挑战称为流处理或数据集成。

Spring XD 将这些类型的问题直接放在十字线上。 Spring XD建立在Spring Integration和Spring Batch的基础上,因此受益于Spring Integration带来的丰富的适配器集和事件驱动的处理范例,还受益于数据处理和作业编排的智能Spring Batch带来了它。

在Spring XD中,数据来自源,然后可以进行处理,分析并最终写入接收器。 Spring XD中数据通过其传递的给定路径称为流。 Spring XD是一个交钥匙的运行时。 根据Spring Integration流程和Spring Batch作业以及给定的ID定义组件,然后由Spring XD管理。

Spring XD组件使用DSL进行编排(并由其ID引用),该DSL看起来(异常!)就像Unix bash命令行中将stdin和stdout从一个单独集中的命令行实用程序传递到另一个命令行实用程序一样。 这绝非偶然:Spring XD包含管道和过滤器范例。 这种编排DSL的另一个好处是它足够高级,因此业务分析师或更高级别的运营商都可以使用它。 Spring XD可以透明地横向扩展以适应负载,在多个节点之间分布处理。


定义流的示例如下所示:消息应该来自时间组件,然后传递到日志组件,而这两个组件(时间和日志)的实际情况和操作取决于您。 这当然是一个非常简单的例子。 您可以通过这种方式编写非常复杂的工作流脚本,并通过Spring XD操作员外壳即时更改流。

xd:> stream create --definition " time | log  " --name ticktock

在下面的视频中,我演示了如何通过Spring XD HTTP端点发送订单,然后通过 Pivotal HD 单节点虚拟机中 托管的机器学习库(Madlib)传输数据 。 Pivotal HD是Pivotal的Hadoop发行版。 Madlib引擎具有一个模型,该模型预先训练有某些类型的欺诈性订单的知识。 它使用该模型和 线性回归 来评估收到的订单是否是欺诈性的,实时的。 结果将反映在浏览器中,该浏览器每5秒更新一次,并突出显示带有欺诈性订单的区域。

弹簧

有关使用Spring XD的更多资源:

使用Spring 打造更丰富的Web:使用Spring 构建Web应用程序和Web服务

如今的Web应用程序通常不像具有丰富JavaScript / HTML5或本机移动前端的REST支持的后端那样。 REST 不是标准,而是一组旨在促进充分利用而不是仅通过HTTP进行传输的服务的使用和使用的原则。

休息

Spring MVC(Spring核心框架的一部分)使构建RESTful Web服务变得非常简单,并且在Spring Framework 4的新@RestController批注中提供了用于构建REST服务的更加简洁的语法:

package demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    public static class Greeting { 
        private String message; 

        public Greeting(String msg){
          this.message = msg;
        }
        public String getMessage(){
          return this.message;
        }
    }

    @RequestMapping("/hi")
    public Greeting sayHi(@RequestParam String name){
        return new Greeting( "Hi, " + name +"!" );
    }
}

这是REST Web服务的示例,它在/ users和/ customers端点下公开有关用户和客户实体的信息。 在视频中,我通过常规的旧浏览器访问和REST插件操作REST服务。 请注意,输出采用 JSON编码

弹簧

使用Hypermedia和Spring HATEOAS的智能客户端

这是一个好的开始,但是我们可以做得更好。 首先,客户需要先知道深层链接,才能访问与给定实体相关的任何其他资源。 另外,没有关于状态的说明! 一些资源是有状态的。 例如,在用户已经结帐后,应该不可能在购物车中添加一些东西,但是无论如何,都没有阻止客户尝试的东西。

HATEOAS 设计模式 所倡导的 超媒体 可以在这里为我们提供帮助。 最终,HATEOAS仅用于对元数据,超媒体以及响应进行编码。

Spring HATEOAS资源对象充当数据的信封,并带有描述相关资源的链接。 这是一个使用Spring HATEOAS的Spring MVC REST控制器方法:

@RequestMapping(method = RequestMethod.DELETE, value = "/users/{user}")
    @ResponseBody Resource<User> deleteUser( @PathVariable Long userId ) {
        User user = crmService.removeUser(userId);
        Collection<Link> links = new ArrayList<Link>();

        // "/users/5"
        Link self = linkTo(methodOn(UserController.class)
            .loadUser(userId)).withSelfRel();

        // "/users/5/customers"
        Link customers = linkTo(methodOn(UserController.class)
            .loadUserCustomers(userId)).withRel( "customers" );

        // "/users/5/photo"
        Link photo = linkTo(methodOn(UserProfilePhotoController.class)
            .loadUserProfilePhoto(userId)).withRel( "photo" );

        links.addAll(photo, customers, self);

        Resource<User> userResource = new Resource<User>(user, links);
        return new ResponseEntity<Resource<User>>(userResource, HttpStatus.OK);
    }

在上面的示例中,我返回一个Spring HATEOAS Resource对象,该对象包含Link对象的集合和User类型的有效负载.User是要返回给客户端的实体。 结果看起来像这样:

{
    "firstName": "Josh",
    "lastName": "Long",
    "username": "joshlong",
    ...
    "links" : [
        { "rel": "self", "href" :"http://localhost:8080/users/5" },
        { "rel": "photo", "href" :"http://localhost:8080/users/5/photo" },
        { "rel": "customers", "href" :"http://localhost:8080/users/5/customers" }
    ]
}

这些额外的元数据链接到与此资源具有相关关系的资源。 客户端遵循rels,而不是URI,并且可以根据是否存在链接来调整其行为。 例如,当购物车中没有东西时,在商务应用程序中为订单付款的链接将是不合适的。

弹簧

以下是一些开始使用Spring和REST的资源:

Web套接字

REST是一种构建HTTP绑定的Web服务的好方法,但是HTTP本质上是仅客户端可以发起的单方面对话。 Websockets 是用于客户端和服务器之间的双向消息传递式通信的标准化协议。 Firefox 6,Safari 6,Google Chrome 14,Opera 12.10和Internet Explorer 10中实现了WebSocket协议的安全版本。

Spring支持 相关的Websocket JSR 356 ,但不仅提供了更多功能,而且还填补了JSR(可理解)模糊的空白。 Spring的WebSocket支持可以独立于JSR进行工作,并提供对 通过WebSocket 进行 STOMP 框架的消息传递的 支持 。 Spring还支持 Sock.js 协议, Sock.js 协议是WebSocket协议的超集,流行的Sock.js JavaScript客户端可以使用它来解决防火墙限制,并在可能无法使用websocket的旧版浏览器上提供正常的通信降级。

这是一个支持WebSocket的Spring MVC控制器的示例。 getPositions方法处理来自客户端的所有调用,以订阅/ positions目标上的事件。 这是一个被动通道,在呼叫时发回位置。

executeTrade方法处理从客户端到Spring MVC websocket控制器的调用。 这两种方法都带有javax.security.Principal的参数,Spring Security自动将其放置在对我们的请求中。

@Controller
public class PortfolioController {

        private static final Log logger = LogFactory.getLog(PortfolioController.class);
        private final PortfolioService portfolioService;
        private final TradeService tradeService;

        @Inject
        public PortfolioController(PortfolioService portfolioService, TradeService tradeService) {
                this.portfolioService = portfolioService;
                this.tradeService = tradeService;
        }

        @SubscribeEvent("/positions")
        public List<PortfolioPosition> getPositions(Principal principal) throws Exception {
                logger.debug("Positions for " + principal.getName());
                Portfolio portfolio = this.portfolioService.findPortfolio(principal.getName());
                return portfolio.getPositions();
        }

        @MessageMapping("/trade")
        public void executeTrade(Trade trade, Principal principal) {
                trade.setUsername(principal.getName());
                logger.debug("Trade: " + trade);
                this.tradeService.executeTrade(trade);
        }

        @MessageExceptionHandler
        @SendToUser("/queue/errors")
        public String handleException(Throwable exception) {
                return exception.getMessage();
        }

} 

要查看运行中的WebSocket,请观看以下视频。

弹簧

使用Spring保护安全的,连接的Web应用程序和Web服务

Spring Security 与企业身份验证和授权后端(如 SAMLKerberos ,pam和LDAP) 很好地集成在一起 。 Spring Security为现代应用程序提供了同类最佳,开放的Web就绪和企业就绪的安全性。 例如,Spring Security支持同时充当 OAuth客户端和使用OAuth 保护 服务, 并为现代Web应用程序提供保护,包括[全面CSRF( 跨站请求伪造 )保护和会话固定保护。

这里有一些资源可以帮助您开始使用Spring Security:

您的用户在线,已连接并且社交。 很难忽视与服务提供商API(如Facebook,Twitter和Pinterest)集成所带来的机遇。 今天有许多丰富的第三方API可与之集成– SOA终于来了! –总体而言,它们都受到OAuth 1.0,OAuth 1.0.a或OAuth 2.0的保护。 如果我不告诉您OAuth在没有支持的情况下实施会非常痛苦,那我将是不诚实的。 Spring Social 提供了支持。 Spring Social提供了许多基于Spring Social的身份验证和授权支持的API绑定。 通过 基于Spring Social的 第三方提供商丰富生态系统, 甚至可以使用更多API绑定 !

例如,这是我们如何在我们的Spring MVC控制器之一中使用Spring Social Facebook绑定:

@Controller
@RequestMapping("/")
public class HelloController {

    @Inject private Facebook facebook;

    @RequestMapping(method=RequestMethod.GET)
    public String helloFacebook(Model model) {
        model.addAttribute(facebook.userOperations().getUserProfile());
        return "hello";
    }

}
在下面的视频中,我们将浏览 Spring Social Showcase ,其中展示了Spring Social制作典型的“使用..登录”样式表单和API通讯的简短工作。 第三方绑定通常会在派生此特定项目以展示其绑定的独特功能时添加自己的屏幕。

弹簧

以下是Spring Social入门的一些资源:

移动网络

今天的用户通过他们的移动设备访问网络的数量越来越多。 移动应用程序将您的应用程序的覆盖范围大大扩展到用户的移动设备(永远不会让大多数人掏腰包!),平板电脑,汽车等。

图表中显示的数字是大多数开发人员不能忽视的数字。 值得庆幸的是,如果使用Spring,他们不必一定要这样做! 当我查看该图表时,对我来说很明显,为Android和iOS进行构建很有意义。 这些都是具有本地惯用的处理方式的丰富平台。 Spring for Android 可帮助您更快地建立连接的Android客户端。 特别是,它将Spring框架的RestTemplate带到了Android。 RestTemplate是Spring核心框架的HTTP客户端,因此使用HTTP资源非常简单。 Spring Social建立在RestTemplate之上,Spring Social绑定也可以在Android上运行!

通过Spring Mobile ,可以轻松地提供对移动设备友好HTML应用程序,并以适合设备的方式处理移动访问者。 当为您不打算优先考虑的平台开发后备体验时,这可能是一种有用的方法。 除本地Android和iOS应用程序外,许多公司都采用这种策略来适应所有其他平台,而对于这些平台而言,可能不值得开发本地解决方案。 这也是一种面向未来的策略:未来的平台无疑将支持浏览器,并且(如果没有其他支持)可以通过移动Web应用程序使用您的应用程序。

这是一个使用两个应用程序的示例,一个是iOS Objective-C客户端(右侧),另一个是Spring for Android客户端(左侧)。 它们都使用OAuth与我先前介绍的受Spring Security OAuth保护的REST服务进行通信。

弹簧  

Spring运行您的应用程序

Spring的可移植性故事首屈一指。 如今,现代应用程序的部署目标千差万别,这种可移植性比以往任何时候都变得更加重要。

..在Java EE上

如果您卡在Java EE应用程序服务器上,请不要担心! Spring具有对Java EE的一流支持,甚至还提供了最新一代Java EE(在本例中为Java EE 7)中的许多新功能,而这些功能在商业支持的应用服务器中通常不可用。 Spring支持许多Java EE JSR,甚至Spring团队甚至还帮助塑造了一些在应用服务器之外有价值的应用程序,例如webocksets JSR(JSR 356),批处理JSR(JSR 352)。与 Spring Batch 非常 相似 !)。 一些JSR,例如缓存JSR(JSR 107)已在Spring应用程序中得到支持,并且已经使用了几年,即使最终的JSR甚至还没有作为Java EE的一部分提供! Spring 4为其他Java EE 7 JSR提供了强大的支持,例如日期/时间API,JTA 1.2,JMS 2.0,JPA 2.1,Bean验证1.1,JSR-236,Servlet 3.1和WebSockets(JSR 356)中的新并发API。

..在Apache Tomcat上

令人高兴的是,大多数开发人员都在使用较轻的容器,例如Jetty和(相当可观的) Apache Tomcat 。 在这些目的地,Spring运行良好。 Apache Tomcat是Pivotal tcServer的核心,tcServer是Apache Tomcat的二进制兼容版本,除其他功能外,还具有出色的管理和监视功能。

..在云端

Spring的能力使您与基础平台隔离,这使其成为云的理想选择,因为云的部署目标不同,运行时服务也各不相同。 Spring在所有云环境中运行。 它适用于常见的可疑对象(例如,亚马逊网络服务)以及更奇特的目的地,例如Google App Engine,由于Google的JDK白名单,Java EE应用程序无法完全运行。

Spring在其他PaaS环境(例如Heroku,OpenShift)中运行良好,尤其是在 Cloud Foundry (Pivotal的开源平台即服务) 上享有特殊的地位 。 例如,这里是一个Spring configuraton类,它使用称为配置文件的功能,该功能使开发人员可以定义特定于环境的配置。 该configuratoin类旨在在Cloud Foundry上运行,并使用CloudFactory API动态查找本地javax.sql.DataSource实例。 可以轻松想象为开发人员,生产人员,旧版应用程序服务器(例如GlassFish)定义其他此类配置类,以及根据应用程序的用例所需的更多类!

@Configuration
@Profile("cloud")
public class CloudConfig {

    @Bean public Cloud cloud()  throws CloudException {
            CloudFactory cloudFactory = new CloudFactory();
            return cloudFactory.getCloud();
    }
    
    @Bean public DataSource dataSource() {
            return cloud().getSingletonServiceConnector(DataSource.class, null);   
    }
}

这仅仅是个开始…

我们已经研究了丰富的Spring IO平台,并且-希望-研究了您认为可以采取下一步措施的各种技术。

Spring 继续领导业务,使现代开发人员“能够以业务的速度(和规模)发展”。 它变得越来越好,并且作为 Pivotal的 一部分, 它的发生速度甚至更快。 该 社区是一个巨大的,也是最重要的,第二部分 。 我的名字叫 Josh Long ,我是Spring Developer Advocate,我很想继续与您在线讨论。 请 随时 通过Twitter 与 我(@starbuxman)Spring团队 的其他 成员(@SpringCentral)保持联系 。 我们总是很高兴收到您的来信,并在可能的情况下提供帮助。




翻译自: https://jaxenter.com/have-you-seen-spring-lately-107268.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值