Apache OpenWebBeans , JSR 365 依赖注入(CDI 2.0)的一种实现,最近发布的 Meecrowave 微服务器的服务器 1.0 为 Java Persistence API(JPA)、Java Transaction API(JTA) 和 OAuth2 提供了内置支持,不再像 Java EE 那样需要完整的容器。
Meecrowave 基于一些现有的 Apache 项目之上构建,包括 Tomcat (servlet)、 OpenWebBeans (CDI), Johnzon (JSON-P 和 JSON-B)以及 CFX (JAX-RS)。
Meecrowave 最初于 2017 年 1 月发布,可用于微服务和独立应用。正如他们的博客中所定义的:
Meecrowave 可以通过 Maven 插件启动(为了易于开发),或以编程方式作为嵌入式服务器,作为应用程序与业务代码捆绑在一起,也可以作为启动可移植的 WAR 或 JAR 应用程序的执行者。
Meecrowave 由以下组件组成:
核心组件定义了一系列配置和命令行界面(CLI)选项。还可以通过实现 Cli.Options
接口并使用 @CliOption
注释来定义自定义 CLI 选项,如下文所示。
Maven 和 Gradle 组件提供与核心配置和 CLI 选项对应的属性,并允许更改默认值。
入门
以下 JAX-RS 示例演示如何开始使用 Meecrowave 。
Defaults
类为示例应用程序定义了 fisrtName
和 lastName
。请注意使用名为 app-default-name
的选项来扩展 CLI 以及相应的描述。
public class Defaults implements Cli.Options { @CliOption(name="app-default-name", description="The default first and last names for the app.") private String firstName="Michael"; private String lastName="Redlich"; public String getFirstName() { return firstName; } public String getLastName() { return lastName; } }
DefaultsProducer
类注入了 Meecrowave 的 Builder
类的实例,用于启动 Meecrowave 。通过 getExtension()
方法来获取 Defaults 类中的 @CliOption
注释中定义的名称和描述。
@Dependent public class DefaultsProducer { @Inject private Meecrowave.Builder builder; @Produces @ApplicationScoped public Defaults defaults() { return builder.getExtension(Defaults.class); } }
SimpleApplication
类定义了主应用程序路径,redlich
:
@Dependent @ApplicationPath("redlich") public class SimpleApplication extends Application { }
SimpleEndpoint
类定义了端点、meecrowave
、URL 查询参数、firstName
和 lastName
,以及一个内部类,Hello
,用于为名称建模的 Java bean。
@Path("meecrowave") @ApplicationScoped public class SimpleEndpoint { @Inject private Defaults defaults; @GET @Produces(MediaType.APPLICATION_JSON) public Hello sayFullName(@QueryParam("firstName") final String firstName,@QueryParam("lastName") final String lastName) { return new Hello(ofNullable(firstName).orElse(defaults.getFirstName()),ofNullable(lastName).orElse(defaults.getLastName())); } public static class Hello { private String firstName; private String lastName; public Hello() { } private Hello(final String firstName,final String lastName) { setFirstName(firstName); setLastName(lastName); } public String getFirstName() { return firstName; } public void setFirstName(final String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(final String lastName) { this.lastName = lastName; } } }
编译并运行 Maven:
mvn clean package meecrowave:run
服务器运行后,完整的 URL 由主应用程序路径和端点组成,其可在浏览器中输入:
http://localhost:8080/redlich/meecrowave
注意显示 “Michael” 和 “Redlich” 的默认值。 URL 查询参数可用于更改在 firstName
和 lastName
中定义的默认值。以下是通过 URL 只更改 firstName
的示例:
http://localhost:8080/redlich/meecrowave?firstName=Rowena
下一个示例演示如何通过 URL 同时更改 firstName
和 lastName
:
http://localhost:8080/redlich/meecrowave?firstName=Barry&lastName=Burd
可以在 GitHub 上找到完整的示例应用程序。
Meecrowave 也有同伴项目:
- Apache DeltaSpike (配置、异常处理、高级 CDI)
- Apache Sirona (监控)
新的 CDI 2.0 规范的支持越来越受关注,Apache 最近发布了旨在使用新 CDI 2.0 规范的 OpenWebBeans 2.0.0 。
查看英文原文: Apache OpenWebBeans Releases Meecrowave Server Version 1.0 for Java EE-Based Microservices
感谢冬雨对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论