Предположим, у меня есть такой компонент, как:
@Component
public class MyComponent {
...
}
Теперь я хочу создать экземпляр этого компонента вручную и сделать его одноэлементным, поэтому в своей основной функции я создаю новый контекст и затем создаюnew 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
out MyComponent
в сканировании компонента AppConfig
. Я ищу динамическое решение, которое позволит мне сказать Spring не создавать определенные синглтоны, когда они уже существуют в графе зависимостей.
Возможно ли это или нет?