Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Micronaut如何仅使用@inject注释进行注入?_Java_Dependency Injection_Javabeans_Inject_Micronaut - Fatal编程技术网

Java Micronaut如何仅使用@inject注释进行注入?

Java Micronaut如何仅使用@inject注释进行注入?,java,dependency-injection,javabeans,inject,micronaut,Java,Dependency Injection,Javabeans,Inject,Micronaut,我在Micronaut项目中使用@Inject通过属性执行依赖项注入。我从最初注入ServiceB的ServiceA开始,ServiceB有一系列自己的依赖项,一切看起来都很和谐 @Singleton public class ServiceA { @Inject private ServiceB serviceB; @Inject private ServiceC serviceC; ... } 当我向ServiceA添加ServiceC(

我在Micronaut项目中使用@Inject通过属性执行依赖项注入。我从最初注入ServiceB的ServiceA开始,ServiceB有一系列自己的依赖项,一切看起来都很和谐

@Singleton
public class ServiceA {
    @Inject
    private ServiceB serviceB;

    @Inject
    private ServiceC serviceC;
    
    ...
}
当我向ServiceA添加ServiceC(它没有任何依赖项)时,问题出现了,应用程序在运行时抛出以下异常

Error processing bean [Definition: ...] method definition [...]: Failed to inject value for field [serviceC] of class: ServiceA

Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [ServiceC] exists.
使代码重新编译和运行的修复方法是向ServiceC添加一个@Singleton。到目前为止,ServiceB和ServiceC之间的唯一区别是ServiceB为类属性提供了@Inject,而Serivec为整个类提供了@Singleton注释

因此,我的问题是:Micronaut如何理解如何在属性中只使用@inject注释而不使用任何类级注释(如@Singleton),在Micronaut中指定注释的真正规则/层次结构是什么


感谢

可能是因为Micronaut定义了一个类,该类有一个用
@Inject
注释的字段/方法,它隐式地是一个bean。--我建议更喜欢构造函数注入,而不是字段注入。是的,我同意更喜欢构造函数注入,但是我认为如果没有注释应用到一个依赖于另一个类的类,那么问题仍然是一样的。但我不确定将整个类转化为beanAa的隐式行为。我说:CDI容器无论如何都必须分析注释,因此可能会定义所有具有用
@Inject
注释的字段或方法的类本身就是bean。“CDI容器无论如何都必须分析注释”-那不是真的。假设您指的是依赖注入(DI)容器,该容器不分析注释。在DI容器实例存在之前,我们在编译时进行DI注释处理。
public class ServiceC {
    ...
}
Error processing bean [Definition: ...] method definition [...]: Failed to inject value for field [serviceC] of class: ServiceA

Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [ServiceC] exists.