春季注入内心阶层

时间:2012-09-06 07:12:53

标签: 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"仅由内部类使用,所以我不想用它来污染外部类。将声明保留在内部类中的其他原因是,如果我将AnotherClass成员移动到外部类,我必须从内部类中删除static修饰符或将其添加到外部类成员。

2 个答案:

答案 0 :(得分:5)

仅当spring实例化对象时才使用@Inject之类的注释。由于您使用@Named注释外部,因此spring将从中创建一个bean并正确地注入SomeClass实例。另一方面,inner可能是您手动实例化的,因此Spring无法注意到这个注释并对其做了些什么。

这不是关于内部或顶级课程,而是关于谁创造了对象。

答案 1 :(得分:0)

从JVM的角度来看,静态内部类与顶级类没有区别,因此您可以将静态内部类声明为Spring bean(例如,通过使用@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;
   }
}
相关问题