Хороший способ получить доступ к Spring Singleton из объектов домена? - PullRequest
1 голос
/ 07 июля 2010

У меня есть модель домена, которая состоит из довольно больших графов объектов, где объекты домена создают другие объекты домена и так далее. Каждому из этих доменных объектов необходим доступ к небольшому количеству вспомогательных объектов одноэлементного типа для различных целей.

Я собирался реализовать их, используя шаблон синглтона Java, когда вспомнил, что я уже использую Spring, и я могу использовать Spring для создания экземпляра каждого из этих помощников при запуске приложения.

Мой вопрос заключается в том, как найти их в объектах моего домена? Это все объекты, которые создаются с помощью оператора «new» и не находятся под контролем Spring.

Я думаю, я мог бы использовать метод "getBean", если бы у меня были руки в контексте приложения Spring (а я нет) - но хороша ли эта производительность? Мне нужно, чтобы все было быстро ... А как быстро получить контекст приложения?

Ответы [ 3 ]

3 голосов
/ 07 июля 2010

В типичном приложении Spring описываемая вами логика кросс-сущности обычно реализуется на уровне бизнес-сервисов (т. Е. Управляемых Spring-объектах), а не в доменных объектах.Доменные классы в приложениях Spring, как правило, представляют собой довольно простые контейнеры данных, возможно, с некоторыми методами для выполнения базовых операций над данными, которые они инкапсулируют, но не дотягивают до управления графами сложных объектов вне себя.Таким образом, объекты бизнес-сервисов управляют объектами домена, а не наоборот.

Если вы настаиваете на инъекции синглетонов в ваши доменные объекты, вы можете добиться этого, используя AspectJ .Сама Spring не очень хорошо это поддерживает.

2 голосов
/ 07 июля 2010
public class SpringApplicationContextProvider implements ApplicationContextAware {
  public void setApplicationContext(ApplicationContext ctx)
        throws BeansException {
      // Wiring the ApplicationContext into a static method
      SpringApplicationContext.setApplicationContext(ctx);
  }
}

И определить SpringApplicationContext как,

public class SpringApplicationContext {
   private static ApplicationContext ctx;

   public static void setApplicationContext(
        ApplicationContext applicationContext) {
      ctx = applicationContext;
   }


   public static ApplicationContext getApplicationContext() {
      return ctx;
   }

   private SpringApplicationContext(){

   }
}

Определите SpringApplicationContextProvider как bean-компонент Spring в вашем конфигурационном файле. Теперь к контексту приложения можно получить доступ с помощью этого поставщика.

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