2009-07-20 7 views
6

私は複数の画面を持つアプリケーションを持っており、各画面はボタンで選択されています。各画面にはかなり重量のあるコンポーネントが含まれているので、アクティブ化画面だけがメモリに保存されていることが重要です。他のすべてはガベージコレクションのために利用可能です。Springのメソッドインジェクションとは対照的にgetBeanの使用

アプリ接着剤のためのスプリングを使用し、現在それがgetBean()を使用して画面を切り替え:

//event handler for a specific button 
public void actionPerformed(Event e) { 
    setScreen((Screen) applicationContext.getBean("screen1")); 
} 

「SCREEN1は」ボタンが押されたときに画面の新しいインスタンスが作成されたプロトタイプの豆です。また、setScreen()は、Screenへの参照がアプリ​​ケーション内で維持される唯一の場所であり、以前アクティブな画面がガベージコレクションで利用できるようになります。私はまだこれをテストしていないが、うまくいくと思う - ここにロケット科学はない!

getBean()が悪いと思われる理由について、this pageを読んだ後に問題が発生しました。getBean()への依存を取り除いているときに同じ結果を達成するためにもっと慣れ親しんだ方法があるのだろうかと思います。

私はメソッドインジェクションを見てきましたが、それはほとんど役に立たない複雑さを導入するように私に見えます。 CGLIBへの依存性を追加するというもう一つのコンセプトです。私が本当にSpringへの依存性を取り除きたいのであれば、getBean()メソッドを公開するインタフェースを導入することができます。

私の場合、getBean()とメソッド注入は唯一のオプションですか、何か逃しましたか?

もしそうなら、getBean()は本当に悪いですか?

答えて

0

ファクトリーアプローチを検討しましたか?

と組み合わせる
public interface ComponentFactory<T> { 
    T create(); 
} 

public class ScreenFactory implements ComponentFactory<Screen> { 
    @Override 
    Screen create() { ... } 
} 

public class MyApp { 
    private ComponentFactory<Screen> screen1; 

    public void actionPerformed(Event e) { 
    setScreen(screen1.create()); 
    } 

    public void setScreen1(ComponentFactory<Screen> screen1) { 
    this.screen1 = screen1; 
    } 

    private void setScreen(Screen screen) { ... } 
} 

<bean id="screenFactory" class="com.myclass.ScreenFactory"/> 

<bean id="myapp" class="..."> 
    <property name="screen1" ref="screenFactory"/> 
</bean> 

あなたができるもちろんの自動ワイヤー上で。

あなたがしていることの問題は、インスタンス化しているBeanを両方ともハードコードし、実装をApplicationContextに結びつけることです。あなたのアプリケーションやコンポーネントを模擬したり単体テストしたりする必要があるなら、それはあなたの人生を信じられないほど困難にするでしょう。上記の工場のソリューションはそれを自明にします。

+0

あなたの解決策では、getbean()はfactory create()メソッド内で呼び出されます。 –

+0

正確ではありません。これはファクトリメソッドに置き換えられましたが、上記のインターフェイスを模擬するのはアプリケーションコンテキストを模擬するよりもずっと簡単です。プラスは差し替え可能です。最終的には、Springのメソッドインジェクションhttp://static.springsource.org/spring/docs/2.5のやや簡単な実装です。x/reference/beans.html#beans-factory-lookup-method-injection – cletus

+0

工場のcreate()メソッドはどこからそのScreenインスタンスを取得しますか? –

3

セッター注入、プロパティ注入またはコンストラクター注入はすべて、擬似によってテストする方がはるかに簡単な疎結合のアプリケーションを作成します。また、どのクラスもSpring(または他のIoCコンテナ)クラスに直接依存することを防ぎます。 getBean()を手動で呼び出す必要がない場合は、全体的な解決策として機能します。

私はあなたが依存関係を設定するという概念に慣れていると思う。 「魔法」はまったく魔法ではなく、あなたがそれを使用するときにあなたが快適になるようなものです。

+0

私は、IMOが "標準"のDependency Injectionとは異なるlookup-methodタグを使用したメソッド注入について言及しています。これは別の機能であり、AOP(したがってCGLIB)に依存するものであり、 cletusはこれを実証していますか?) –

+0

工場はSpringへの依存を分離しますが、これは維持するための不要なコードだと思います。 AOPの何が問題なの? AOPは、SpringがDIをどのように実行するかの実装の詳細です。 – geofflane

0

getBeanを取り除きたい場合は、ServiceLocatorFactoryBeanを使用することを検討してください。しかし、これがどのようにうまくいくかは、あなたのアプリケーションで文字列 "screen1"がどこから来ているかによって決まるかもしれません。

関連する問題