2011-09-20 2 views
1

우리가 자바 패키지를 상상해보십시오. 이 패키지는 어디에서나 사용할 수 있습니다. 그러나이 패키지에는 컨텍스트에 따라 일부 코드가 있습니다. 예를 들어,이 패키지를 사용하는 응용 프로그램이 웹 응용 프로그램 인 경우 응용 프로그램이 동일한 기능을 호출하여 콘솔 응용 프로그램 인 경우 다른 작업을 수행하면서 함수를 호출하여 일부 작업을 수행해야합니다.자바 코드에서 응용 프로그램의 유형을 감지하는 방법

응용 프로그램이 웹 응용 프로그램 또는 콘솔로 실행 된 경우 코드 내에서 우리가 감지 할 수있는 자바에있는 어떤 방법이 있나요 : 여기

내 질문입니까? 내가 어떤 도움 : 현실 세계 예를 들어

, 우리는 특성 파일을 웹과 콘솔 애플리케이션을위한 다른로드 방법을 주셔서 감사합니다.

웹 응용 프로그램의 경우 우리는 아마 this.getClass().getClassLoader().getResourceAsStream(url)를 사용하여 콘솔 응용 프로그램을 위해 우리는 new FileInputStream(physical path)를 사용합니다.

답변

2

내가 그렇게 할 수있는 신뢰할 수있는 방법이 있다고 생각하지 않기 때문에, 응용 프로그램 유형을 감지하려고 곳보다는 빌드 속성을 설정하는 것이 좋습니다 수 있습니다. 보기 층 (중 웹, 데스크탑 또는 콘솔) 현대 건축의 원칙에 따라 쉽게 교환 할 수 있어야하기 때문에

또한 당신은 응용 프로그램의 유형을 감지하려고해서는 안된다.


마지막 코멘트에 대한 응답입니다.

는 user384706는 DI 여기 IMO 올바른 선택을 말했듯이. 봄에 예를 들어 보겠습니다. 모두 콘솔 및 웹 응용 프로그램 부분에서

당신은 할 수 있습니다 : 당신의 loadProperties() 방법이 PropertyProvider의 다른 구현을 오버라이드 (override) 할 것

public class WebOrConsoleServiceImpl { 

    private PropertyProvider propertyProvider = new NullPropertyProvider(); 

    // and 

    public void setPropertyProvider(PropertyProvider impl) { 
     this.propertyProvider = impl; 
    } 

    // and in your service logic 

    public void logic() { 

     final Properties props = propertyProvider.loadProperties(); 
     // do stuff    
    } 
} 

.

그리고 당신의 봄 컨텍스트에서

당신은 할 수 있습니다 :

<bean id="consolePropertyProvider" class="com.company.ConsolePropertyProvider"/> 

<bean id="myConsoleService" class="com.company.MyConsoleService"> 
    <property name="propertyProvider" ref="consolePropertyProvider" /> 
</bean> 

그리고 WebServiceWebPropertyProvider 당신을위한 bean 정의의 동일한 쌍.

+0

내가 같은 코드를 원하는하지만이 작동하지 않습니다. 속성을로드하는 것에 대해 제기 한 한 가지 예가 내 문제 중 하나입니다. 만약 내가 애플 리케이션 타입을 알고 있다면 적절한 코드를 넣을 수있다. 그렇지 않으면 내가 무엇을 해야할지 전혀 모른다 : ( – tecfield

+0

어딘가에 빌드 속성을 설정할 수 없다? 어떻게하면 프로젝트를 만들 수 있을까? 어떤 파일을 빌드해야하는 경우에는? deployment.type = [web | console | desktop]과 같은 파일을 추가하고 배치에 따라이 값을 변경할 수 있습니다. 이것은 앱 유형 IMO를 감지하는 가장 신뢰할 수있는 방법입니다. – Simeon

+0

동일한 프로젝트이므로 – tecfield

1

그냥 사용 dependency injection
설정자를 통해 라이브러리를 구성하기 위해 모든 적절한 매개 변수를 배치하고 컨테이너 또는 응용 프로그램이 DI를 사용하여 그에 맞게 구성하게하십시오.
그래서 당신은 이럴 나쁜 방법

+0

[채팅에서 계속 토론] (http://chat.stackoverflow.com/rooms/3663/discussion-between-simeon-and-tecfield)을 허용합니다. 그렇게 할 수 없습니다. 의존성 주입은 좋지만 설정을 자주 변경할 필요가없는 경우 유용합니다. – tecfield

+0

+1 : 예 DI가 아마 최선 (표준?) 방법 일 것입니다. – Simeon

0
  1. 는 J2EE 방법에게 어떤 검사를하지 않아도됩니다. 패키지가 웹 응용 프로그램에서 사용되는 경우 J2EE 컨테이너에 있다고 가정하고 배포시 이름 지정에 Reference을 추가 할 수 있습니다. 이 참조에 대한 변경 사항을 수신하고 런타임에 코드의 동작을 수정할 수있는 MDB를 등록 할 수도 있습니다. 좋았어?

  2. 호출자의 컨텍스트를 전달할 수있는 다른 표준 방법은 매개 변수화 된 팩토리 또는 속성을 통한 것입니다.

  3. 하나의 표준이 아닌 방법 - 재미 get the stack trace에 있으며 발신자가 누구 찾거나 J2EE 컨텍스트 등을 찾아

+0

# 3을 시도합니다. doable하지만 신뢰할 수 있는지 확실하지 않은 경우 : D thnx – tecfield

+0

3 번 호출자가 누구인지는 미리 알지 못하기 때문에 확실히 신뢰할 수 없습니다. 확실히 할 수 있습니다. Thread.currentThread(). getStackTrace()를 호출 한 다음 그것을 반복합니다. – RHT

관련 문제