Micronaut FAQ
以下部分涵盖了您在考虑使用或使用 Micronaut 时可能会问到的常见问题。
Micronaut 会修改我的字节码吗?
不,你的类就是你的类。Micronaut不会转换类,也不会修改从你写的代码中生成的字节码。Micronaut在编译时产生额外的类,与你原来未修改的类在同一个包中。
为什么 Micronaut 不使用 Spring?
当问到为什么 Micronaut 不使用 Spring 时,通常是指 Spring 依赖注入容器。
Spring 生态系统非常广泛,您可以在 Micronaut 中直接使用许多 Spring 库,而无需 Spring 容器。
Micronaut 具有自己的原生 JSR-330 兼容依赖注入的原因是 Spring(以及任何基于反射的 DI/AOP 容器)中这些功能的成本在内存消耗和对启动时间的影响方面太大了。为了在运行时支持依赖注入,Spring:
读取它在运行时找到的每个 bean 的字节码。
为每个 bean 方法、构造函数、字段等上的每个注释合成新注释以支持注释元数据。
为每个方法、构造函数、字段等的每个 bean 构建反射元数据。
结果是随着您的应用程序包含更多功能,启动时间和内存消耗逐渐减少。
对于启动时间和内存消耗保持低水平至关重要的微服务和无服务器功能,上述行为是使用 Spring 容器的不良现实,因此 Micronaut 的设计者选择不使用 Spring。
Micronaut 支持 Scala 吗?
Micronaut 支持任何支持注释处理器 API 的 JVM 语言。 Scala 目前不支持这个 API。但是,Groovy 也不支持此 API,并且已经构建了处理 Groovy AST 的特殊支持。如果构建类似于 inject-groovy 的模块,将来在技术上可能会支持 Scala,但在撰写本文时,Scala 尚不支持。
Micronaut 可以用于微服务以外的目的吗?
是的。 Micronaut 是非常模块化的,您可以通过在应用程序中包含 micronaut-inject-java(或 micronaut-inject-groovy for Groovy)依赖项来选择仅使用依赖注入和 AOP 实现。
事实上,Micronaut 对无服务器计算的支持正是使用了这种方法。
Micronaut 的 Dependency Injection 和 AOP 实现有什么优势?
Micronaut 在编译时处理您的类并生成所有元数据。这消除了对反射、缓存反射元数据的需要,以及在运行时分析类的要求,所有这些都会导致启动性能变慢和内存消耗增加。
此外,Micronaut 在编译时构建无反射 AOP 代理,从而提高性能、减少堆栈跟踪大小并减少内存消耗。
为什么 Micronaut 有自己的 Consul 和 Eureka 客户端实现?
现有的大多数 Consul 和 Eureka 客户端都是阻塞的,并且包含许多使 JAR 文件膨胀的外部依赖项。
Micronaut 的 DiscoveryClient 使用 Micronaut 的原生 HTTP 客户端,大大减少了对外部依赖的需求,并在两个发现服务器上提供了一个反应式 API。
为什么我在加载 bean (Groovy) 时遇到 NoSuchMethodError?
Groovy 默认导入 groovy.lang 包中的类,包括一个名为 @Singleton 的类,这是一个 AST 转换类,它通过添加私有构造函数和静态检索方法使您的类成为单例。这个注释很容易与用于在 Micronaut 中定义单例 bean 的 javax.inject.Singleton 注释混淆。确保在 Groovy 类中使用正确的注解。
为什么启动应用程序花费的时间比应有的时间长得多
Micronaut 的启动时间通常非常快。但是,在应用程序级别,可能会影响启动时间。如果您看到启动缓慢,请查看任何启动缓慢的应用程序启动侦听器或 @Context 范围 bean。
一些网络问题也可能导致启动缓慢。例如,在 Mac 上,错误配置 /etc/hosts 文件可能会导致问题。请参阅以下 stackoverflow 答案。
更多建议: