Ссылка на синглтон бин весной
Я новичок в Spring и поэтому заранее извиняюсь, если вопросы кажутся тривиальными.
Когда я объявляю боб весной, он по умолчанию одноэлементный. Когда Spring инициализирует bean -компоненты из config.xml, он использует создатель по умолчанию. Если я объявляю свой закрытый создатель и метод getInstance для класса, я не получаю ссылку на bean -компонент, созданный во время инициализации Spring - я просто снова создаю тот же класс, и на этот класс ссылаются, когда getInstance() вызывается в любое время позже.
Мой вопрос, как я могу получить ссылку на синглтон, созданный во время инициализации (на bean -компонент, определенный в config.xml) из кода.
4 ответа
Если ваш класс реализует шаблон Singleton, то нет никакого способа getInstance()
вернет экземпляр, отличный от того, что создал Spring.
Как я могу получить ссылку на синглтон, созданный во время инициализации
По сути, вам следует ввести его в другой класс, где он вам понадобится. И вы также можете обратиться к нему по ApplicationContext.getBean()
Хотя это не так элегантно.
Если у вас есть метод фабрики в вашем коде, тогда вызовите конфигурацию xml, чтобы вызвать этот фабричный метод вместо конструктора. Не звони getInstance
из вашего кода Java.
<bean id="fromFactory" class="org.example.MyFactory" factory-method="getInstance" />
Spring по умолчанию создаст один экземпляр вашего класса. Он вызовет конструктор класса один раз. Я думаю, что вы спутали это с
public static void getInstance()
идиома для синглетонов в Java, которая является попыткой обеспечить в вашем классе, что вы никогда не сможете иметь более одного экземпляра.
Spring создал один экземпляр вашего класса и хранит его в контейнере Spring, готовом для использования. Чтобы получить ссылку на экземпляр, созданный Spring, вам нужно извлечь его из контекста приложения Spring.
Я думаю, что это может иметь отношение к вашему вопросу: почему SpringCon ApplicationContext.getBean считается плохим?
Есть несколько способов: вы можете получить свой экземпляр компонента из ApplicationContext, вы можете @Autowire его и т. Д.