[解決済み] Spring Java Config:実行時引数を持つプロトタイプスコープの@Beanを作成する方法は?
質問
SpringのJava Configを使用して、実行時にのみ取得可能なコンストラクタ引数を持つプロトタイプ・スコープのBeanを取得/インスタンス化する必要があります。 以下のコード例を考えてみましょう(簡潔にするために簡略化しています)。
@Autowired
private ApplicationContext appCtx;
public void onRequest(Request request) {
//request is already validated
String name = request.getParameter("name");
Thing thing = appCtx.getBean(Thing.class, name);
//System.out.println(thing.getName()); //prints name
}
ここで、Thingクラスは以下のように定義されています。
public class Thing {
private final String name;
@Autowired
private SomeComponent someComponent;
@Autowired
private AnotherComponent anotherComponent;
public Thing(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
お知らせ
name
は
final
: コンストラクタを介してのみ供給可能であり、不変性を保証します。 その他の依存関係は、実装固有の依存関係である
Thing
クラスは、リクエストハンドラの実装に知られてはいけません (密結合されてはいけません)。
このコードは、例えばSpring XMLのconfigで完全にうまく動作します。
<bean id="thing", class="com.whatever.Thing" scope="prototype">
<!-- other post-instantiation properties omitted -->
</bean>
Java の config で同じことを実現するにはどうしたらいいですか? Spring 3.xを使用すると、以下はうまくいきません。
@Bean
@Scope("prototype")
public Thing thing(String name) {
return new Thing(name);
}
さて、私は できる をファクトリーで作成する、など。
public interface ThingFactory {
public Thing createThing(String name);
}
しかし、その Springを使用してServiceLocatorとFactoryのデザインパターンを置き換えた意味がなくなります。 このユースケースには理想的なのですが。
Spring Java Configでこれができれば、回避できるのですが。
- ファクトリーインターフェースの定義
- ファクトリーの実装を定義する
- ファクトリー実装のテストを書く
SpringがXMLコンフィグで既にサポートしているような些細なことなのに、(相対的に見れば)これは大変な作業です。
どのように解決するのか?
で
@Configuration
クラスでは
@Bean
メソッドを使用します。
@Bean
@Scope("prototype")
public Thing thing(String name) {
return new Thing(name);
}
を登録するために使用されます。
を作成するためのファクトリーを提供します。
. このビーンが定義するBeanは,リクエストに応じて,直接またはスキャンによって決定される引数を使用してインスタンス化されるだけです。
ApplicationContext
.
の場合は
prototype
ビーンでは、毎回新しいオブジェクトが作成されるため、対応する
@Bean
メソッドも実行されます。
からBeanを取得することができます。
ApplicationContext
を使用して、その
BeanFactory#getBean(String name, Object... args)
というメソッドがあります。
明示的なコンストラクタ引数/ファクトリメソッドの指定を可能にする。 の引数で指定されたデフォルトの引数を上書きします。 ビーン定義
パラメータです。
引数 明示的な引数を使用してプロトタイプを作成する場合に使用する引数です。 を静的ファクトリーメソッドに追加します。NULL でない args 値を使用することは無効です。 を使用します。
つまり、この
prototype
スコープされたビーンでは、ビーンクラスのコンストラクタで使用される引数を提供するのではなく
@Bean
メソッドを呼び出すことができます。(このメソッドは、ビーンの名前検索を使用するため、型保証が非常に弱いです)。
あるいは、型付き
BeanFactory#getBean(Class requiredType, Object... args)
メソッドは、ビーンをタイプ別に検索します。
これは少なくともSpringのバージョン4以上では正しい。
なお、もし最初に
ApplicationContext
または
BeanFactory
をビーン取得のために注入することができます。
ObjectProvider
(Spring 4.3以降)。
のバリアントです。
ObjectFactory
インジェクションポイントのために特別に設計されています。 プログラム的なオプションと寛大なnot-uniqueの処理を可能にする。
を使用し、その
getObject(Object... args)
メソッド
オブジェクトのインスタンス(共有または独立)を返します。 このファクトリーによって管理されます。
に沿って、明示的な構築引数を指定できるようにする。 の
BeanFactory.getBean(String, Object)
.
例えば、こんな感じです。
@Autowired
private ObjectProvider<Thing> things;
[...]
Thing newThing = things.getObject(name);
[...]
関連
-
IllegalArgumentException この例外を解決する方法
-
SpringBootApplication を型解決できない。
-
javaの模造品QQ WeChatのチャットルーム
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] Javaで汎用配列を作成する方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
SpringBootApplication を型解決できない。
-
Dateが型に解決できない問題を解決する
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
Java(1)仕上げの基本概念+eclipseのインストール構成