2010-04-14 3 views
0

내 생각의 getBean()비 관리 봄 봄 웹 응용 프로그램 및 jar 파일로는

I가 가지고해야 Spring에 의해 관리

서비스

포함 된 .jar 파일을 만드는 것입니다 기능 웹 응용 프로그램의 WEB-INF/lib에 넣으려는 경우

그런 다음 web-app Servlets에서 Jar 파일의 기능을 사용하고 싶습니다.

1 아이디어. 스프링 컨텍스트 (getBean() 등)에 대한 호출을 캡슐화하는 클래스를 작성하십시오. 예를 들어, 사용할 클래스는 단순히 매개 변수를 가져오고 매개 변수 을 리턴하지만 그 클래스 안에는 Spring의 getBean 등이 호출됩니다

이 경우 JAR 가져 오기를 통해 서블릿에서 사용하는 데는 문제가 없을 것입니다. 콩만을 포장하기 위해 콩을 얻으려면 .jar 내부에서 어떤 종류의 컨텍스트를 사용해야합니까? ApplicationContext 또는 무엇?

2 아이디어. jar 파일로 압축 한 다음 Spring 환경에서 관리하지 않는 서비스를 사용하는 간단한 해결책이 있습니까?

답변

1

그렇게 할 가능성이 많습니다. Spring을 사용하기 위해, 당신은 봄이되기 위해 모든 것을 필요로하지 않습니다.

예를 들어, 당신은 당신의 web.xml에 봄을 구성 할 수 있습니다 서블릿에서

<web-app ...> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath*:com/acme/foo/applicationContext.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    ... 
</web-app> 

당신이 콩에 액세스 할 수 WebApplicationContextUtils.getWebApplicationContext(servletContext).getBean("myBean") 할 수 있습니다.

환경에 따라 다른 통합 수단이 있습니다. 예를 들어, JSF에서 org.springframework.web.jsf.el.SpringBeanFacesELResolver을 사용할 수 있습니다. Here은 스프링 관리 빈을 사용하는 JSF 애플리케이션의 예제이다.

+0

@lexicore 구성 스 니펫이 멋지게 보입니다 (작동하는 경우). 몇 가지 세부 사항에 대해 물어볼 수 있을까요? 보시다시피, 저는이 경우 Spring 관리 클래스를 WEB-INF/classes 어딘가에 배치해야합니다. 별도의 .jar 파일은 어떻습니까? 모든 것이 jar로 압축되어 WEB-INF/lib에 저장되면이 설정이 작동합니까? – EugeneP

+1

@EugeneP 확실하게 작동합니다. 링크를 게시 한 샘플 프로젝트를 확인하십시오. 클래스와 applicationContext.xml이 WEB-INF/classes에 있거나 WEB-INF/lib에 jar로 존재하는지는 중요하지 않습니다. 클래스 패스에서로드됩니다. 저는 이것에 대해 100 % 확신합니다. 이것은 우리가 많은 프로젝트에서하는 것과 정확히 같습니다. – lexicore

+0

beans.xml에서 "context : component-scan"을 사용합니다. 아마도 문제 일 수 있습니다. jar를 컴파일하고, WEB-INF/lib에 넣고, 제안한대로 web.xml을 편집했습니다. 한 가지를 이해하지 못합니다. beans.xml을 어디에 넣을까요? jar 파일에 보관하거나 WEB-INF 디렉토리에 넣을까요? 두 가지 방법 모두 시도했는데 그 결과는 같습니다. beans.xml에 명시 적으로 존재하는 bean을 얻을 수는 있지만 구성 요소 검사 작업 (@Autowired)을 얻을 수는 없습니다. 오류는 다음과 같습니다. "명명 된 bean이 없습니다 ... 정의되었습니다." 어떤 아이디어? – EugeneP

2

ApplicationContextgetBean() (으)로 전화하는 경우 다소 요점을 놓치고 있다고 생각해야합니다. 이 정확한 문제를 없애기 위해 스프링이 발명되었습니다. 스프링은 의존성 주입 원리 (제어의 반전)에서 작동합니다. 즉, 이름으로 서비스를 요청하지 않고 필요로하는 위치에 서비스를 삽입한다는 것입니다. 이름이 지정되어 있으면 이름 지정은 코드가 아닌 구성의 일부입니다.

classpath의 일부인 다른 jar의 클래스를 사용하는 데 문제가 없습니다. 다른 클래스와 마찬가지로로드됩니다. 학생들이 수업 경로에 있지 않더라도 필요한 경우 ClassLoader을 사용할 수 있습니다. 좀 더 복잡한 곳은 클래스가 다른 JVM에있는 곳입니다. 심지어 그렇게 할 수는 있지만 여기서는 그렇지 않은 것처럼 들립니다.

여기서 말하는 매개 변수는 어디에 있습니까? 어떤 종류의 레지스트리 나 수동으로로드 된 컨텍스트로부터의 명시적인 서비스 위치를 구현하는 대신 RESTful 종류의 방법 (스프링 3 MVC에서 잘 지원되는 것)으로 명명 된 서비스를 일부 컨텍스트에 바인딩하는 것을 강력하게 권고합니다.

+0

@cletus 네가 맞아.하지만 서비스를 전체 블록으로 보면, 어딘가에서 얻을 수있을거야? getBean()은 갈 길이 멀다. – EugeneP

+0

@Eugene 그것은가는 길입니다. 아주 좋은 방법은 아닙니다. Spring은 여러분에게 숨길 수 있도록 구현 된 구현 세부 사항입니다. 좋은 이유로. – cletus

+0

매개 변수 내가 말하는 것은이 일입니다.즉, 데이터베이스에 저장해야하는 객체를 생성하고 ServiceLayerWraper 메서드에 전달해야합니다. DAO는 내부에없는 것처럼 보입니다.하지만 실제로 래퍼 클래스 [SeviceLayerWraper]는 getBean()을 통해 Spring에서 ServiceLayer 객체를 가져오고 체인을 통해 참조 객체를 전달합니다. 그런 다음 ServiceLayer는이를 데이터베이스에 저장합니다 (종속성, DAO 호출). – EugeneP