Получение контекста приложения Spring из объекта не bean без использования Singleton - PullRequest
9 голосов
/ 24 января 2009

Мне нужно получить контекст приложения Spring от объекта не bean. В другом потоке в SO принятый ответ предлагает использовать синглтон для получения контекста приложения. Получение контекста приложения Spring

Но использование синглтона делает мой код более связанным и менее тестируемым; обычные проблемы обсуждаются во многих потоках (например, Что плохого в Singletons )

Вопрос, есть ли элегантный способ получить контекст приложения из объекта не bean без использования singleton?

Ответы [ 2 ]

8 голосов
/ 10 октября 2012

Я думаю, что ваша проблема примерно такая же, как и у меня несколько дней назад. Я думаю, что следующее должно работать для вас:

Сначала создайте класс с именем AppContextManager, как показано ниже:

@Component
public class AppContextManager implements ApplicationContextAware{
    private static ApplicationContext _appCtx;

    @Override
    public void setApplicationContext(ApplicationContext ctx){
         _appCtx = ctx;
    }

    public static ApplicationContext getAppContext(){
        return _appCtx;
    } 
}

Аннотируйте вышеуказанный класс с помощью @Component или объявите bean-компонент для AppContextManager в вашем application context xml.

Теперь в вашем экземпляре non-singleton non-spring используйте следующий фрагмент кода, чтобы получить любой другой фасоль:

ApplicationContext ctx = ApplicationContextManager.getAppContext();
SomeSpringBean bean = ctx.getBean(SomeSpringBean.class);

И это даст вам экземпляр компонента в любом месте вашего кода.

7 голосов
/ 24 января 2009

Всегда есть проблема с загрузкой. Для веб-приложений обычно есть внешний фильтр сервлета, который обрабатывает ситуацию.

Если не веб-приложение, то нет никакого способа обойти какой-нибудь внешний синглтон или загрузчик. Но; использование здесь синглтона должно влиять только на тестируемость этого единственного класса начальной загрузки. На самом деле в вашем коде должно быть очень мало мест, которые должны ссылаться на контейнер каким-либо явным образом. Так что это не сильно увеличивает сцепление.

Или, если перефразировать, на самом деле должно быть очень мало объектов, не принадлежащих бобам, которые должны получить доступ к контейнеру пружины. Если это не так, то вы, вероятно, не используете пружину оптимально. И большинство / все те, кому нужен контейнер, должны, вероятно, просто реализовать BeanFactoryAware или ApplicationContextAware

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...