3

内部クラスにBeanを注入することは可能ですか?

例えば:

@Named
public class outer {

   @Inject
   private SomeClass inst; // Injected correctly

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

編集:「AnotherClass」は内部クラスでのみ使用されるため、外部クラスを汚染したくありません。宣言を内部クラスに保持するもう 1 つの理由は、AnotherClass メンバーを外部クラスに移動する場合、静的修飾子を内部クラスから削除するか、外部クラス メンバーに追加する必要があるためです。

4

2 に答える 2

5

のような注釈は、Spring@Injectがオブジェクトをインスタンス化する場合にのみ使用されます。outer でアノテーションを付けたので、Spring@Namedはそれから 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 に答える