Micronaut Groovy 支持
Groovy 在 Micronaut 中拥有一流的支持。
Groovy 专用模块
存在特定于 Groovy 的附加模块,可改善整体体验。这些在下表中有详细说明:
依赖 | 描述 |
---|---|
|
包括 AST 转换以生成 bean 定义。应该是 compileOnly 在你的类路径上。 |
|
添加以 Groovy 格式(即 application.groovy)在 src/main/resources 下指定配置的能力 |
|
包括 AST 转换,可以更轻松地为 AWS Lambda 编写函数 |
您需要的最常见模块是 micronaut-inject-groovy,它为 Groovy 类启用 DI 和 AOP。
CLI 中的 Groovy 支持
Micronaut 命令行界面包括对 Groovy 的特殊支持。要创建 Groovy 应用程序,请使用 groovy lang 选项。例如:
Create a Micronaut Groovy application
$ mn create-app hello-world --lang groovy
上面生成了一个 Groovy 项目,使用 Gradle 构建。使用 -build maven 标志来生成一个使用 Maven 构建的项目。
一旦您创建了具有 groovy 特性的应用程序,create-controller、create-client 等命令就会生成 Groovy 文件而不是 Java。以下示例在使用 CLI 的交互模式时演示了这一点:
Create a bean
$ mn
| Starting interactive mode...
| Enter a command name to run. Use TAB for completion:
mn>
create-bean create-client create-controller
create-job help
mn> create-bean helloBean
| Rendered template Bean.groovy to destination src/main/groovy/hello/world/HelloBean.groovy
上面的示例演示了如何创建一个如下所示的 Groovy bean:
Micronaut Bean
package hello.world
import javax.inject.Singleton
@Singleton
class HelloBean {
}
Groovy 自动导入 groovy.lang.Singleton,这可能会造成混淆,因为它与 javax.inject.Singleton 冲突。确保在声明 Micronaut 单例 bean 时使用 javax.inject.Singleton 以避免意外行为。
我们还可以创建一个客户端——别忘了 Micronaut 可以充当客户端或服务器!
Create a client
mn> create-client helloClient
| Rendered template Client.groovy to destination src/main/groovy/hello/world/HelloClient.groovy
Micronaut Client
package hello.world
import io.micronaut.http.client.annotation.Client
import io.micronaut.http.annotation.Get
import io.micronaut.http.HttpStatus
@Client("hello")
interface HelloClient {
@Get
HttpStatus index()
}
现在让我们创建一个控制器:
Create a controller
mn> create-controller helloController
| Rendered template Controller.groovy to destination src/main/groovy/hello/world/HelloController.groovy
| Rendered template ControllerSpec.groovy to destination src/test/groovy/hello/world/HelloControllerSpec.groovy
mn>
Micronaut Controller
package hello.world
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.HttpStatus
@Controller("/hello")
class HelloController {
@Get
HttpStatus index() {
return HttpStatus.OK
}
}
正如您从 CLI 的输出中看到的那样,还为您生成了一个 Spock 测试,它演示了如何测试控制器:
HelloControllerSpec.groovy
...
void "test index"() {
given:
HttpResponse response = client.toBlocking().exchange("/hello")
expect:
response.status == HttpStatus.OK
}
...
请注意您如何使用 Micronaut 作为客户端和服务器来测试自己。
使用 GroovyRouterBuilder 的编程路由
如果你更喜欢以编程方式构建你的路由(类似于 Grails UrlMappings),一个特殊的 io.micronaut.web.router.GroovyRouteBuilder 存在,它有一些增强功能可以使 DSL 更好。
以下示例展示了 GroovyRouteBuilder 的实际应用:
Using GroovyRouteBuilder
@Singleton
static class MyRoutes extends GroovyRouteBuilder {
MyRoutes(ApplicationContext beanContext) {
super(beanContext)
}
@Inject
void bookResources(BookController bookController, AuthorController authorController) {
GET(bookController) {
POST("/hello{/message}", bookController.&hello) (1)
}
GET(bookController, ID) { (2)
GET(authorController)
}
}
}
您可以使用注入控制器按约定创建路由,使用 Groovy 方法引用创建方法路由
ID 属性可用于引用包含 {id} URI 变量
上面的示例导致以下路由:
- /book - 映射到 BookController.index()
- /book/hello/{message} - 映射到 BookController.hello(String)
- /book/{id} - 映射到 BookController.show(String id)
- /book/{id}/author - 映射到 AuthorController.index
在 Groovy 应用程序中使用 GORM
GORM 是一个数据访问工具包,最初是作为 Grails 的一部分创建的。它支持多种数据库类型。下表总结了使用 GORM 所需的模块,以及文档链接。
依赖 | 描述 |
---|---|
|
为 Groovy 应用程序配置 GORM for Hibernate。 |
|
为 Groovy 应用程序配置 GORM for MongoDB。 |
|
为 Groovy 应用程序配置 Neo4j 的 GORM。 |
一旦您按照上表中链接的说明配置了 GORM 实现,您就可以使用 GORM 的所有功能。
GORM 数据服务还可以参与依赖注入和生命周期方法:
GORM Data Service VehicleService.groovy
@Service(Vehicle)
abstract class VehicleService {
@PostConstruct
void init() {
// do something on initialization
}
abstract Vehicle findVehicle(@NotBlank String name)
abstract Vehicle saveVehicle(@NotBlank String name)
}
您还可以将服务定义为接口而不是抽象类,让 GORM 为您实现方法。
使用 Groovy 的无服务器函数
微服务应用程序只是使用 Micronaut 的一种方式。您还可以将它用于 AWS Lambda 等无服务器功能。
通过 function-groovy 模块,Micronaut 增强了对用 Groovy 编写的函数的支持。
更多建议: