57

静的メソッドを持つ Util クラスがあります。Util クラス内で、Spring Bean を使用したいので、それらを util クラスに含めました。私の知る限り、Spring Bean を静的フィールドとして使用することはお勧めできません。しかし、静的メソッドでSpring Beanにアクセスする方法はありますか?

私の例:

public class TestUtils {

   private static TestBean testBean;

   public void setTestBean(TestBean testBean) {
     TestUtils.testBean = testBean;
   }

  public static String getBeanDetails() {
    return beanName = testBean.getDetails();
  }
}

多くのフォーラムで、これがベスト プラクティスではないことがわかりました。この種のシナリオを処理する方法を教えてもらえますか?

私の構成ファイル:

<bean id="testUtils" class="com.test.TestUtils">
 <property name="testBean" ref="testBean" />
</bean>
4

8 に答える 8

66

InitializingBean私のアプローチは、実装または使用するためにアクセスしたいBean@PostConstructであり、それ自体への静的参照を含んでいます。

例えば:

@Service
public class MyBean implements InitializingBean {
    private static MyBean instance;

    @Override
    public void afterPropertiesSet() throws Exception {
        instance = this;
    }

    public static MyBean get() {
        return instance;
    }
}

したがって、静的クラスでの使用法は次のようになります。

MyBean myBean = MyBean.get();

このように、XML 構成は必要ありません。Bean をコンストラクター引数として渡す必要はありません。呼び出し元は、Spring を使用して Bean が接続されていることを認識したり気にしたりする必要はありません (つまり、乱雑なApplicationContext変数)。

于 2013-03-16T06:03:35.867 に答える
24

静的メソッドの結果は、メソッドに渡されたパラメーターのみに依存する必要があるため、Bean を呼び出す必要はありません。

別の Bean を呼び出す必要がある場合、メソッドはスタンドアロン Bean のメンバー メソッドである必要があります。

他の回答は実用的な解決策を提供しますが、それが実行できるという事実は、それが実行されるべきであることを意味するものではありません.

于 2012-09-22T15:08:18.273 に答える
21

次のように、 ApplicationContextAwareインターフェイスを実装することもできます。

@Component
public class TestUtils implements ApplicationContextAware {

  private static ApplicationContext ac;

  public static String getBeanDetails() {
    return beanName = ((TestBean) ac.getBean("testBean")).getDetails();
  }

  @Override
  public void setApplicationContext(ApplicationContext ac) {
    TestUtils.ac = ac;
  }

}
于 2012-09-22T15:24:20.560 に答える
7

@nullPainter の応答に似ていますが、次のことを行いました。構築後のロジックは必要ありません。インジェクション中に静的メンバーを直接設定するだけです( @Autowired メソッド内)。

@Service
public class MyUtil {

    private static MyManager myManager;

    @Autowired(required = true)
    public void setMyManager(MyManager manager) {
        myManager = manager;
    }

    public static MyManager getMyManager() {
        return myManager;
    }
}
于 2016-11-01T19:15:20.197 に答える
1

これは、静的フィールドのスプリングから注入した方法です。

<bean id="..." class="...">
 <property name="fieldToBeInjected">
            <util:constant static-field="CONSTANT_FIELD" />
        </property>
</bean>

多分これもあなたを助けるでしょう。

于 2012-09-22T13:44:05.830 に答える
0

あなたが概説したアプローチは、Spring Bean をユーティリティ クラスに注入するために使用されているのを見たものです。

<bean id="testUtils" class="com.test.TestUtils">
 <property name="testBean" ref="testBean" />
</bean>

別のオプションは次のとおりです。

<bean name="methodInvokingFactoryBean" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="staticMethod" value="TestUtils.setInstance"/>
        <property name="arguments">
            <list>
                <ref bean="testBean"/>
            </list>
       </property>
</bean>

と:

public class TestUtils {

   private static testBean;

   public static void setInstance(TestBean anInstance) {
     testBean = anInstance;
   }

  public static String getBeanDetails() {
    return testBean.getDetails();
  }
}

詳細はこちらこちら

于 2012-09-21T23:32:25.110 に答える