2013-05-16 2 views
1

У меня есть устаревшее приложение, использующее одноэлементный шаблон для всех служб и доступ ко всем сервисам через ServiceName.getInstance() внутри служб, которые используют другие службы и в веб-уровне. Я конвертирую проект для использования Spring и думал о создании одноуровневого служебного класса ServiceProvider с методами getServiceA, getServiceB..etc и получить его из контекста приложения Spring. Я буду использовать ServiceProvider в веб-уровне только потому, что я не могу конвертировать его, чтобы использовать Spring только и автоуверять все службы, которые используют другие службы. Это хорошее решение?Spring Framework Abstraction

У меня очень простой веб-уровень, и, возможно, кто-то может порекомендовать как его сменить с минимальными изменениями. У меня есть карта url для контроллеров, загруженных при запуске. RequestDispatcher анализирует URL-адрес запроса, просматривает контроллер по классу и выполняет метод шаблона (существуют различные подклассы базового контроллера, но это не усложняет проблему).

RequestDispatcher:

protected void service(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 


     int slashIndex = req.getRequestURL().lastIndexOf("/"); 
     String path = req.getRequestURL().substring(slashIndex, req.getRequestURL().length()); 


     ServiceURL url = urlMap.get(path); 

     ServiceProvider.getLog().info("Requested page: " + path); 
     if (url != null) { 

      try { 
       Utils.authenticate(req, resp); 
       grantAccess(req, url); 
       BaseServlet servlet = (BaseServlet)url.getClass().getClassLoader().loadClass(url.getClassName()).newInstance(); 

       servlet.service(req, resp); 
      } 
      catch (AuthorizationException e) { 

       resp.getWriter().write(new ErrorModel("You are not authorized to perform the requested action.").getContent()); 
       ServiceProvider.getAuthLog().info("auth", e); 
      }catch (SystemException e) { 

Я думаю аннотирование моих сервлетов в качестве компонентов, имея пакеты автоматического сканирования. Может ли ApplicationContext получить компонент по имени полного класса?

+0

Почему, на ваш взгляд, это хорошее решение или нет? – NINCOMPOOP

+0

Каковы альтернативы? – user979051

ответ

2

Похоже, что ваши услуги не имеют гражданства. Я бы позаботился о них с помощью @Service (сделайте их весенними бобами) и просто @Autowire их везде, где вам нужно. Пусть Spring действует как поставщик услуг.

+0

Как я могу их автообновить в своем веб-слое, когда я имею дело с наследием в домашней веб-среде, не под управлением весны? Если бы я использовал Spring Web, это было бы проще, так как контроллеры mvc были бы управляемы весной. – user979051

+0

Что вы пытаетесь получить, перейдя на Spring? Если вы не будете конвертировать свой веб-уровень в Spring MVC, тогда да, вы можете просто создать фабричный класс, который получает экземпляры из контекста приложения по их имени. Но все же, если вы не кодируете сервисные интерфейсы, вы не получите многого, это будет то же самое, что и ваша текущая реализация, просто экземпляры, созданные Spring. – braincell

+0

Я планирую извлечь интерфейсы. Я хочу упростить изменение среды выполнения с помощью конфигурации. Во-первых, тестовая реализация для уровня обслуживания (модульное тестирование/макет). – user979051

0

Ваше решение getInstance() похоже на то, что объекты не являются излишними.

Если вам нужно получить доступ к службам в виде поиска JNDI, вы должны настроить их как таковые весной.

Если он находится под контролем Spring, его не следует указывать в коде. Если он создан в вашем коде, это не под контролем Spring.

+0

В настоящее время они не находятся под контролем Spring, и это то, что я пытаюсь изменить. Служба ServiceProvider.getServiceA() получит услугу из ApplicationContext (она будет управляться весной). – user979051

+0

Я не понимаю, зачем вы это делаете. Просто вводите его в объект, который ему нужен. Вы раньше использовали Spring? – duffymo

+0

Я новичок в Spring, но как я могу впрыснуть что-нибудь в свой веб-уровень (в доме встроенный в mvc-каркас дома), когда мои контроллеры не являются весенними бобами? Я могу иметь пружинный провод всего до уровня обслуживания – user979051