3

是否可以将bean注入内部类?

例如:

@Named
public class outer {

   @Inject
   private SomeClass inst; // Injected correctly

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

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

4

2 回答 2

5

@Inject只有当 spring 实例化你的对象时才会使用类似的注解。由于您使用 注释 external @Named,因此 spring 将使用它制作一个 bean 并SomeClass正确注入实例。另一方面inner,可能是由您手动实例化的,因此 spring 无法注意到此注释并对其进行处理。

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

于 2012-09-06T09:44:51.013 回答
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;
   }
}
于 2012-09-06T09:53:55.810 回答