2012-09-21 11 views
22

私は静的メソッドを持つUtilクラスを持っています。私のUtilクラスの中で、私は春の豆を使いたいので、私はそれらをutilクラスに含めました。 私が知る限り、静的フィールドとして春の豆を使用するのは良い方法ではありません。 静的メソッドでSpring Beansにアクセスする方法はありますか?静的メソッドで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> 

答えて

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(); 
    } 
} 

詳細はこれは私が静的フィールドの春から注入する方法ですherehere

+0

ない私には明確な..あなたがtestBean設定を追加plzはできますか? – TechSpellBound

1

です。

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

多分、これはあなたにも役立ちます。

10

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

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

他の回答はあなたに実用的なソリューションを提供しますが、実際に実行できるということであっても、実行する必要はありません。

+0

はい、静的クラスで直接設定するのではなく、パラメータとして使うべきだと思います。標準に基づいて、上記のレスポンスに示されているように、さまざまな方法でBeanを使用することはできますが、Beanを静的として使用しないでください。返信いただきありがとうございます。 – Rosh

+1

"静的メソッドの結果は、メソッドに渡されたパラメータにのみ依存する必要があります。"、nice shot! – Nickolas

9

あなたもこのように、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) { 
    this.ac = ac; 
    } 

} 
29

私のアプローチは、1つのInitializingBeanを実装するか@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を渡す必要はありません呼び出し元は、BeanがSpringを使用してワイヤリングされていることを知ったり、気にする必要はありません(つまり、乱雑なApplicationContext変数は必要ありません)。

+0

slick - Springのこのような定期的な問題に対する正しい回避策を見つける良い場所はありますか? –

1

@ 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; 
    } 
} 
+0

'@ Autowired'のデフォルト値である' required = true'パラメータを渡す必要はありません。したがって、 '@Autowired パブリックvoid setMyManager(MyManagerマネージャ){ myManager = manager; } ' で十分でしょう。 – rumman0786

+0

にはほとんど意味がない@Serviceアノテーションが必要です – rohanagarwal

0

これは私のために働きます。

import org.springframework.web.context.ContextLoader; 
import org.springframework.web.context.WebApplicationContext; 

WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); 
DataSource datasource = (DataSource)context.getBean("dataSourceDB_01");  

そして、私のxml設定で:いくつかのクラスで

<bean id="dataSourceDB_01" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName"><value>${db.driver}</value></property>  
    <property name="url"><value>${db.url}</value></property> 
    <property name="username"><value>${db.username_seg}</value></property> 
    <property name="password"><value>${db.password_seg}</value></property> 
</bean> 

HTH

関連する問題