Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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 内部类的弹簧注入_Java_Spring_Inversion Of Control - Fatal编程技术网

Java 内部类的弹簧注入

Java 内部类的弹簧注入,java,spring,inversion-of-control,Java,Spring,Inversion Of Control,可以将bean注入内部类吗 例如: @Named public class outer { @Inject private SomeClass inst; // Injected correctly private static class inner { @Inject private AnotherClass instance; // Not being injected ... 编辑:“AnotherClass”只被内部类使用,所以

可以将bean注入内部类吗

例如:

@Named
public class outer {

   @Inject
   private SomeClass inst; // Injected correctly

   private static class inner {
        @Inject
        private AnotherClass instance;  // Not being injected
...

编辑:“AnotherClass”只被内部类使用,所以我不想用它污染外部类。将声明保留在内部类中的另一个原因是,如果我将另一个类成员移动到外部类中,我必须从内部类中删除静态修饰符,或者将其添加到外部类成员中。

@Inject
这样的注释仅在spring实例化对象时使用。由于您使用
@Named
注释了outer,因此spring将从中生成一个bean,并将正确地注入
SomeClass
实例。另一方面,
internal
可能是由您手动实例化的,因此spring无法注意到此注释并对其进行处理


它不是关于内部类或顶级类,而是关于谁创建对象。

从JVM的角度来看,静态内部类与顶级类没有区别,因此您可以将静态内部类声明为Springbean(例如,通过使用
@Named
对其进行注释)

显然,如果要使注入工作正常,您需要从Spring获取该类的实例:

@Named
public class Outer {
   @Inject
   private Provider<Inner> innerFactory; 

   public void foo() {
       Inner inner = innerFactory.get(); // Injected correctly
       ...
   }

   @Named
   private static class Inner {
       @Inject
       private AnotherClass instance;
   }
}
@Named
公共舱外{
@注入
私人供应商内部工厂;
公共图书馆{
内部=内部工厂。get();//正确注入
...
}
@命名
私有静态类内部{
@注入
私有的另一个类实例;
}
}

我有点好奇。。。为什么我们需要注入到内部类中?为什么不调用外部类方法来获得“inst”?也许他只是好奇它是否工作,我个人认为不会,因为静态内部类是由JVM加载和创建的,导致spring不监督它的创建,因此DI不会工作。如果我错了,请纠正我。@hoaáng Long“AnotherClass”只被内部类使用,所以我不想用它污染外部类。另外一个原因是,我必须从内部类中删除静态修饰符,或者将其添加到外部类成员中。