Ссылка на синглтон бин весной

Я новичок в 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 его и т. Д.

Другие вопросы по тегам