Java 内部类的弹簧注入
可以将bean注入内部类吗 例如: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”只被内部类使用,所以
@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”只被内部类使用,所以我不想用它污染外部类。另外一个原因是,我必须从内部类中删除静态修饰符,或者将其添加到外部类成员中。