私はなどのコンポーネントなどがあるとします。
@Component
public class MyComponent {
...
}
今、私はこのコンポーネントを手動でインスタンス化し、それシングルトン作るので、私の主な機能には、私は新しいコンテキストを作成し、新しいを作成したいMyComponent
とシングルトンとしてそれを登録します。
var context = new AnnotationConfigApplicationContext(AppConfig.class);
context.getBeanFactory().registerSingleton(MyComponent.class.getCanonicalName() + ".ORIGINAL", new MyComponent());
context.refresh();
私が発見しています問題は、つまりMyComponent
、まだによって作成されているSpring
ので、私はクラスの単一のインスタンスで終わるが、二つません。
どのように私はこの作業を行うことができますか?
完全な例:
メインクラス:
package my.spring;
import static org.springframework.beans.factory.config.AutowireCapableBeanFactory.ORIGINAL_INSTANCE_SUFFIX;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringTest extends Application {
@Override
public void start(Stage primaryStage) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
context.getBeanFactory()
.registerSingleton(MyComponent.class.getCanonicalName() + ORIGINAL_INSTANCE_SUFFIX,
new MyComponent());
MyComponent singleton = context.getBean(MyComponent.class); // This fails because there are now two such types
primaryStage.setScene(new Scene(new VBox(20,
new TextArea("Hello Spring"),
new TextArea(singleton.myName))));
primaryStage.setOnCloseRequest(w -> context.close());
primaryStage.show();
}
}
AppConfig.java
package my.spring;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class AppConfig {
}
MyComponent.java
package my.spring;
import org.springframework.stereotype.Component;
@Component
public class MyComponent {
public final String myName = getClass().getCanonicalName();
}
私が探しています解決策を伴わないはずfiltering
うちMyComponent
にAppConfig
コンポーネントスキャン。私は、私は、彼らがすでに依存関係グラフ内に存在する場合、特定のシングルトンを作成しないように春を告げることを可能にするダイナミックな解決策を探しています。
これは可能ですか?
ここでは、このためのさまざまなソリューションは、以下のとおりです。
1)削除アノテーションは@Component
クラス`` MyComponent`を形成します。
2)インターフェイスを定義し、インターフェイスとして必要な場所にそれを注入します。あなたのコードで作成し、「... registerSingleton(...、新しいMyComponentImpl())」のようなインターフェイスの実装。
次のアプローチは、すべての要件に適合していませんが、私はあまりにも、あなたがそれらを検討することをお勧めしたいです。
あなたの目標は、単に特定の名前を持つコンポーネントを登録する場合は3)、使用することを検討してください@Component("MyName")
。
で注釈4)を使用するコンフィギュレーションクラス(@Configuration
)。種類の豆を提供する方法ではMyComponent
、手動であなたのBeanを作成します。ここでは、手動でBeanを登録していないが、それでもあなたは、Beanの作成を制御できます。たとえば、あなたは、いくつかの設定パラメータに応じて異なることを初期化することができ、またはあなたも異なるサブクラスのインスタンスを作成することができます。
5)このBeanを作成するファクトリを実装します。ここでも、あなたはそれを直接注入しないでしょう。しかし、あなたはあなたのBeanの作成を完全に制御する必要があります。
あなたが実際に達成しようとしているものを教えている場合、また、他のソリューションが存在することができます。