2014-10-17 2 views
1

봄을 사용하여 jar 라이브러리를 만들고 웹 응용 프로그램에서 가져 오려고합니다. 후자에서 봄을 사용하기 때문에 아무런 문제가 없습니다. 요점은 비 스프링 관리 환경에서도 재사용하고 싶다는 것입니다. 순수한 javaee 웹 응용 프로그램에서 lib를 사용하려는 경우 스프링 자동 배선 및 패키지 스캔 기능을 사용할 수 없습니다. 내 생각은 다음의 costructor에 간단한 순수 콩 및로드 스프링 구성을 만들 : 스프링 관리 웹 응용 프로그램에서 사용자 정의 스프링 jar를 작성 /로드하는 방법

public class SpringStandalone{ 

private Client      client; 
private AnnotationConfigApplicationContext ctx; 

public SpringStandalone() { 
    ctx = new AnnotationConfigApplicationContext(); 
    ctx.getEnvironment().setActiveProfiles("test"); 
    ctx.scan("my.package.scan"); 
    ctx.refresh(); 
    client = (Client) ctx.getBean(Client.class); 
    ctx.destroy(); 
} 

public void send(Object o) { 
    client.send(o); 
} 

} 

이 올바른 방법으로이 작업을 수행하기 위해인가요? 그렇다면 어떻게해야 applicationContext destroy를 관리해야합니까? (걱정해야합니까?)

미리 도움을 주셔서 감사합니다.

파비오

답변

1

당신 는 Spring 애플리케이션 컨텍스트를 파괴하고 클라이언트 오브젝트가 작동 희망하지 수 있습니다.
대신 SpringStandalone 클래스가 더 이상 필요하지 않을 때 클라이언트 코드에서 호출 할 별도의 'SpringStandalone.destroy()'메소드를 제공해야합니다.

참고 ctx.destroy()이 아니라 스프링 컨테이너를 삭제하지만, 또한 @PreDestroy, 출판 종료 이벤트 등 주석 모든 빈 메소드를 호출 같은 일부 '비즈니스'작업을 트리거에 대한 호출 . 따라서 SpringStandalone 객체가 더 이상 필요하지 않을 때 호출하는 것이 좋습니다.

나는 당신의 접근 방식에있어 아무런 문제가 없다고 생각합니다.
Spring 응용 프로그램 컨텍스트가로드되는 데 시간이 걸리므로 SpringStandalone을 한 번만 만들려는 것입니다.

+0

글쎄, 그 사이에 단 한 개의 인스턴스 만 가져 오기 위해 springStandalone 클래스를 싱글 톤으로 변경했습니다 (제안한대로). 클라이언트가 호스팅 웹 응용 프로그램이 살아있는 한 오래 살아야하기 때문에 파괴 작업이 응용 프로그램이 종료 된 것과 일치합니다. 내가 맞습니까? 어쨌든 대답에 감사드립니다. – Pirulino

+0

예, 클라이언트 빈이 앱이 살아있는 동안 살아야한다면, 파기 작업은 앱 종료와 일치해야합니다. 싱글 톤에 관해서는 제 생각에는 가능한 솔루션 중 하나 일뿐입니다. 명백한 단점은 이것이 모든 결함을 가진 글로벌 변수라는 것입니다. 또 다른 참고 사항 : 앱 시작시 Spring 구성 문제를 감지하려고하지만 싱글 톤 패턴은 SpringStandalone 생성을 처음 사용할 때까지 연기 할 수 있으므로 앱 시작시 트리거를 생성하도록 명시 적으로 호출하도록 제안합니다. – Alexander

+0

나는 당신에 동의합니다. 도와 주셔서 감사합니다. – Pirulino