我有一个Micronaut应用程序,它的模块都是用Java和Kotlin编写的。Java模块(控制器逻辑)有一个接口,由指定@Singleton注释的Kotlin类实现。
package com.example.controllers;
import com.example.service.Message;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import javax.inject.Inject;
@Controller("/hello")
public class DemoController {
private Message message;
@Inject
public DemoController(Message message) {
this.message = message;
}
@Get(produces = MediaType.TEXT_PLAIN)
public String sayHello() {
return message.getMessage();
}
}
package com.example.service;
public interface Message {
String getMessage();
}
package com.example.service
import javax.inject.Singleton
@Singleton
class MessageImpl: Message {
override fun getMessage(): String {
return "hello"
}
}
注意:https://github.com/micronaut-projects/micronaut-core/discussions/5254有应用程序jar(demo.zip)和复制步骤。
问题是您的项目配置不正确。您使用的是Kotlin,但是build.gradle
文件只为Java配置。如果您使用Launch创建了一个新的Kotlin应用程序,您可以获得一个正确构建的示例。我唯一改变的是main类,因为您使用的是Java类,而不是Kotlin类。
这是完整的build.gradle
:
plugins {
id("org.jetbrains.kotlin.jvm") version "1.4.30"
id("org.jetbrains.kotlin.kapt") version "1.4.30"
id("org.jetbrains.kotlin.plugin.allopen") version "1.4.30"
id("com.github.johnrengelman.shadow") version "6.1.0"
id("io.micronaut.application") version "1.4.2"
}
version = "0.1"
group = "com.example"
repositories {
mavenCentral()
}
micronaut {
runtime("netty")
testRuntime("junit5")
processing {
incremental(true)
annotations("com.example.*")
}
}
dependencies {
implementation("io.micronaut:micronaut-http-client")
implementation("io.micronaut:micronaut-runtime")
implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
implementation("javax.annotation:javax.annotation-api")
implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
implementation("io.micronaut:micronaut-validation")
runtimeOnly("ch.qos.logback:logback-classic")
runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")
}
application {
mainClass.set("com.example.Application")
}
java {
sourceCompatibility = JavaVersion.toVersion("11")
}
tasks {
compileKotlin {
kotlinOptions {
jvmTarget = "11"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "11"
}
}
}
问题内容: 我目前正在尝试将Dagger 2集成到Android应用程序中。我的项目设置如下: 图书馆 应用(取决于库) 在我的库项目中,我定义了一个类,稍后将其插入到库以及应用程序项目中的其他需要该类的类(活动和常规类)中。 现在-例如在我的“片段”或“活动”或常规类中,我将上述Singleton注入如下: 大概我想,因为实际上myManager始终为null。显然,它的构造函数也从未被调用过,
我目前正在尝试将匕首2集成到一个Android应用程序中。我的项目设置如下: 库 应用程序(取决于库) 在我的library项目中,我定义了一个类,以后我将把它注入到库和app项目中需要它的其他类(活动和常规类)中。 我也是这么想的,因为实际上myManager总是空的。很明显,它的构造函数也从来没有被调用过,所以我想我一定遗漏了一些配置方面的东西?或者也许我误解了文档,它根本不是这样工作的?My
我有这个问题,无法理解如何修复它,任何帮助都将得到评估。我需要用一些身份验证来保护REST方法,并且我在我的应用程序中有几个角色。我在我的类中的方法中放置了注释,实现了一些接口和Spring没有创建没有任何日志消息的bean(在我的例子中)。但是如果类没有实现接口-bean创建得很好。 在代码中,它如下所示: 控制器: 接口: 在我的情况下,控制器bean没有创建。但是如果我删除一切都会正常工作,
若要使用2.3.0之前的Android注释,可以执行以下操作: 要使用Kotlin,您可以使用而不是(链接)。 所以我清理并重建了这个项目。似乎annotations没有为MainActivity生成下划线文件。有道理但我不知道为什么或者怎么解决。
从Dagger2文档中,我注意到您可以有一个注释类。将类标记为的目的是什么,因为我在代码中尝试过这样做,但没有生成singleton对象。我不清楚用这个注释标记我的类有什么用。 从文档中,请关注以下声明: injectable类上的@Singleton注释也可用作文档。它提醒潜在的维护者,该类可能由多个线程共享。*
问题内容: 我已经找到了实例化Singleton的三种方法,但是我怀疑其中是否有最好的方法。我在多线程环境中使用它们,并且更喜欢延迟实例化。 范例1: 范例2: 范例3: 我正在使用ATM的项目到处都使用Sample 2,但我还是更喜欢Sample 3。还有Enum版本,但是我不明白。 这里的问题是- 在什么情况下我应该/不应该使用这些变体中的任何一个?我并不是在寻找冗长的解释(对此还有很多其他话