2013-05-16 6 views
1

모든 서비스에 싱글 톤 패턴을 사용하고 다른 서비스 및 웹 티어를 사용하는 서비스 내에서 ServiceName.getInstance()를 통해 모든 서비스에 액세스하는 레거시 애플리케이션이 있습니다. 저는 Spring을 사용하도록 프로젝트를 변환하려고합니다. getServiceA, getServiceB..etc 등의 메소드를 사용하여 ServiceProvider 싱글 톤 유틸리티 클래스를 생성하고 Spring 응용 프로그램 컨텍스트에서 Bean을 가져 오려고합니다. 아직 스프링을 사용하지 않고 다른 서비스를 사용하는 모든 서비스를 자동으로 변환 할 수 없기 때문에 웹 계층에서 ServiceProvider를 사용합니다. 이것은 좋은 해결책입니까?스프링 프레임 워크 추상화

저는 매우 간단한 웹 티어를 가지고 있으며 누군가가 최소한의 변경만으로 탄력을 줄 수있는 방법을 제안 할 수 있습니다. 시작시로드 된 컨트롤러에 대한 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 웹을 사용한다면 mvc 컨트롤러가 스프링으로 관리되기 때문에 더 간단해질 것입니다. – user979051

+0

Spring으로 변환하면 무엇을 얻으려고합니까? 웹 티어를 Spring MVC로 변환하지 않는다면, 애플리케이션 컨텍스트의 인스턴스를 이름으로 가져 오는 클래스와 같은 팩토리를 만들면된다. 그러나 많은 것을 얻지 못하는 서비스 인터페이스에 코드를 작성하지 않는다면 현재 구현 된 것과 동일 할 것이고 Spring에 의해 생성 된 인스턴스 일 것입니다. – braincell

+0

인터페이스를 추출 할 계획입니다. 구성을 통해 실행 환경을 쉽게 변경할 수 있기를 기대합니다. 하나는 서비스 계층 (단위 테스트/모의)에 대한 구현을 테스트합니다. – user979051

0

getInstance() 솔루션은 객체가 unnder Spring 컨트롤이 아닌 것처럼 들립니다.

JNDI 조회로 서비스에 액세스해야하는 경우 Spring에서 서비스를 구성해야합니다.

Spring의 통제하에있는 경우 코드에서 인스턴스화하면 안됩니다. 코드에서 인스턴스화 된 경우 Spring의 제어를받지 못합니다.

+0

현재 그들은 내가 변화 시키려고하는 스프링 컨트롤에 속하지 않습니다. ServiceProvider.getServiceA()는 Spring에서 관리되는 ApplicationContext에서 서비스를 가져옵니다. – user979051

+0

왜 그랬는지 모르겠습니다. 그냥 그것을 필요한 개체에 삽입하십시오. 전에 스프링을 사용한 적이 있습니까? – duffymo

+0

저는 Spring의 초보자입니다.하지만 컨트롤러가 스프링 콩이 아닌데도 집안의 mvc 프레임 워크에 내장 된 웹 티어에 아무 것도 주입 할 수 있습니까? 스프링 와이어를 모든 서비스 레이어에만 연결할 수 있습니다 – user979051