这是针对想要开始使用 Micronaut 的 Spring 应用程序开发人员的指南。通过本指南,您将获得足够的信息来使用 Micronaut 框架。
介绍
Micronaut 是一个框架,它以更快的启动时间而得名,通常是使用 AWS Lambda 的解决方案的首选。它使用提前 (AOT) 编译来确定应用程序需要什么。这样做的结果是应用程序具有更小的内存占用、快速的启动时间和无反射。
该框架提供了依赖注入、控制反转(IOC)和面向切面编程(AOP),这与 Spring 提供的类似。使用 Micronaut,您可以创建命令行应用程序、HTTP 服务器应用程序,甚至是事件驱动的应用程序。
有了这个介绍,让我们看看如何使用 Micronaut 创建一个应用程序。
创建项目
要创建项目,您可以直接转到Micronaut 的启动来创建您的项目。这类似于 spring 如何提供一种使用https://start.spring.io创建项目的方法。
您也可以使用 SDKMan 安装命令行实用程序。命令行实用程序与启动站点的作用相同。有关此的更多详细信息,请参见此处。
在创建项目时,添加Hibernate-JPA功能,因为我们将创建一个具有 CRUD 功能的项目。生成项目后,我们将查看作为 Spring 开发人员通常会做的各种事情。
创建一个 Bean
通常情况下,在春天,你会使用创建一个bean @bean,@Restcontroller,@service,@repository,等。Micronaut,我们有一些注释,则类似的。让我们来看看它们。
- @controller — 为您的休息端点定义您的控制器类。
- @repository — 定义您的存储库 bean。
- @singleton — 定义一个具有单例作用域的 bean。
- @prototype — 定义一个具有原型作用域的 bean
- @requestscope — 定义具有请求范围的 bean。
没有@serviceor@component注释,但您可以使用上述注释来创建服务或组件。
除此之外,我们还@infrastructure必须定义一个对应用程序运行至关重要的 bean,它不应被覆盖,并定义@threadlocal每个线程的 bean 范围的注解。
为了注入特定的 bean,Micronaut 支持基于构造函数、基于 setter、基于名称的相同注入机制,这类似于 spring 提供的。在 的情况下@autowire,您现在将使用@inject注释。
您还可以拥有 bean 生命周期方法、条件 bean、bean 限定符等,它们类似于 spring 提供的那些。您可以随时在此处的Micronaut 文档中阅读有关它的更多信息。
依赖关系
现在,我正在创建一个与 MySQL 通信的 CRUD 应用程序。我需要的来自 Micronaut 的最小依赖是:
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-http-server-netty</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-hibernate-jpa</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.sql</groupId>
<artifactId>micronaut-jdbc-hikari</artifactId>
<scope>compile</scope>
</dependency>
除此之外,我还必须添加mysql-connector-java驱动程序才能与 MySQL 通信。
JPA 配置
要创建实体,您可以使用通常的javax.persistence注释来创建实体、定义 id、列等。
@Entity
@Table(name = "Orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
您的数据源和休眠配置也几乎保持不变:
datasources:
default:
url: jdbc:mysql://localhost:3306/ORDER
username: root
password: root
jpa:
default:
properties:
hibernate:
hbm2ddl:
auto: update
show_sql: true
dialect: org.hibernate.dialect.MySQL8Dialect
为了查询您的数据库,我们从 Micronaut 获取您通过扩展 CRUDRepository 或 JPARepository 等接口创建的接口的实现。我们还使用@query注释提供 JPA 查询支持。这是带有示例查询方法的 JPA 存储库的代码。
@Repository
public interface OrderRepository extends CrudRepository<Order, Long> {
@Query("select o from Order as o")
List<Order> getAllOrders();
}
休息控制器
休息控制器可以通过创建@controller注释,并提供您的GET,PUT,POST使用映射@get,@put,@post注释分别。所有这些注释都来自micronaut-http-client依赖项。
@Controller("/order")
public class WebController {
private final OrderService orderService;
public WebController(OrderService orderService) {
this.orderService = orderService;
}
@Get("/{id}")
public HttpResponse<OrderDTO> getOrder(@PathVariable("id") Long id) {
Optional<OrderDTO> mayBeOrder = orderService.getOrder(id);
if (mayBeOrder.isPresent()) {
return HttpResponse.created(mayBeOrder.get());
}
return HttpResponse.notFound();
}
表现
通过上述配置,应用程序在近2 秒内启动。
__ __ _ _
| \/ (_) ___ _ __ ___ _ __ __ _ _ _| |_
| |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
| | | | | (__| | | (_) | | | | (_| | |_| | |_
|_| |_|_|\___|_| \___/|_| |_|\__,_|\__,_|\__|
Micronaut (v2.5.8)
12:55:07.769 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
12:55:08.150 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
12:55:08.157 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version [WORKING]
12:55:08.248 [main] INFO o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
12:55:08.351 [main] INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.MySQL57Dialect
12:55:09.059 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 1928ms. Server Running: http://localhost:8080
现在,这里有一个问题。
当应用程序启动时,bean 还没有连接好,这会延迟发生。当应用程序接收到第一个请求时,bean 连接发生,因此第一个被服务的请求会有一点延迟。随后的请求非常快。
这是统计数据。
现在为了真正提升启动性能,我们可以创建一个 Native 镜像。使用本机映像,您可以获得大约 90 毫秒的启动时间。
是的,具有 JPA CRUD 功能的90 毫秒。更多的内容可以在GitHub进行了解。