[解決済み] Spring 3アノテーションでシンプルなファクトリーパターンを実装する
質問
Spring 3 のアノテーションを使用して、シンプルなファクトリーパターンを実装する方法を考えていました。 ドキュメントで、ファクトリークラスを呼び出し、ファクトリーメソッドを実行するビーンを作成できることを見ました。 私は、これがアノテーションのみを使用して可能であるかどうか疑問に思っていました。
現在、あるコントローラで
MyService myService = myServiceFactory.getMyService(test);
result = myService.checkStatus();
MyServiceは、checkStatus()というメソッドを1つ持つインターフェースです。
私のファクトリークラスは次のようなものです。
@Component
public class MyServiceFactory {
public static MyService getMyService(String service) {
MyService myService;
service = service.toLowerCase();
if (service.equals("one")) {
myService = new MyServiceOne();
} else if (service.equals("two")) {
myService = new MyServiceTwo();
} else if (service.equals("three")) {
myService = new MyServiceThree();
} else {
myService = new MyServiceDefault();
}
return myService;
}
}
MyServiceOneクラスは次のようになります。
@Autowired
private LocationService locationService;
public boolean checkStatus() {
//do stuff
}
このコードを実行すると、変数locationServiceは常にNULLです。 これは、ファクトリー内で私自身がオブジェクトを作成しているため、自動配線が行われていないためだと思います。 これを正しく動作させるためにアノテーションを追加する方法はありますか?
ありがとうございます。
解決方法は?
あなたの言う通り、手動でオブジェクトを作成することで、Springに自動配線をさせないようにしています。サービスの管理もSpringで行うことを検討してください。
@Component
public class MyServiceFactory {
@Autowired
private MyServiceOne myServiceOne;
@Autowired
private MyServiceTwo myServiceTwo;
@Autowired
private MyServiceThree myServiceThree;
@Autowired
private MyServiceDefault myServiceDefault;
public static MyService getMyService(String service) {
service = service.toLowerCase();
if (service.equals("one")) {
return myServiceOne;
} else if (service.equals("two")) {
return myServiceTwo;
} else if (service.equals("three")) {
return myServiceThree;
} else {
return myServiceDefault;
}
}
}
しかし、全体的なデザインはかなり貧弱だと考えています。いっそのこと、一般的な
MyService
を実装し
one
/
two
/
three
の追加パラメータとして文字列を指定します。
checkStatus()
? 何を実現したいのか?
@Component
public class MyServiceAdapter implements MyService {
@Autowired
private MyServiceOne myServiceOne;
@Autowired
private MyServiceTwo myServiceTwo;
@Autowired
private MyServiceThree myServiceThree;
@Autowired
private MyServiceDefault myServiceDefault;
public boolean checkStatus(String service) {
service = service.toLowerCase();
if (service.equals("one")) {
return myServiceOne.checkStatus();
} else if (service.equals("two")) {
return myServiceTwo.checkStatus();
} else if (service.equals("three")) {
return myServiceThree.checkStatus();
} else {
return myServiceDefault.checkStatus();
}
}
}
これは
今も
を追加するのは、設計が悪い。
MyService
の実装が必要です。
MyServiceAdapter
も修正する必要があります(SRP違反)。しかし、これは実は良い出発点なのです(ヒント:MapとStrategyのパターン)。
関連
-
[解決済み] 一意なビーンによる春の自動配線。Spring は一致する Bean が 1 つであると予想していたが、2 つ見つかった
-
[解決済み] トークンのシンタックスエラー、これらのトークンを削除してください [closed].
-
[解決済み] javaで部分クラスを実装する方法
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] 一部の入力ファイルが非推奨のAPIを使用またはオーバーライドしている
-
[解決済み] タイプの安全性。アンチェック・キャスト
-
[解決済み] 文字列の長さに応じて文字列をトリミングする
-
[解決済み] ヘッドリカーシオンとテールリカーシオンの違い [重複]について
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Spring の @Autowired フィールドが NULL になっているのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] Javaで拡張子なしのファイル名を取得する方法は?
-
[解決済み] Jdbctemplate の文字列に対するクエリです。EmptyResultDataAccessException: 不正な結果サイズ:期待値1、実際0
-
[解決済み] Java - JTextFieldが空かどうかを確認する
-
[解決済み] このフォーマット(Tue Jul 13 00:00:00 CEST 2010)の日付をJavaの日付に変換する方法(文字列はalfrescoのプロパティに由来しています)
-
[解決済み] 環境変数JAVA_OPTSの使い方を教えてください。
-
[解決済み] Javaでのスキャナが動作しない
-
[解決済み] eclipseからTomcatに物理的に発行されるmyjspはどこにあるのでしょうか?
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正