2016-10-19 3 views
0

우리는 다른 jar를 의존성으로 사용하는 Spring 관리 애플리케이션을 가지고있다.이 애플리케이션은 속성 파일속성은 dependency jar (Spring 3/XML) 내에 채워지지 않는다.

에서 주입 된 값을 사용해야하는 Spring 관리 서비스 클래스를 포함한다.

Spring 컨텍스트 설정

public static void main(String[] args) { 
    GenericXmlApplicationContext appContext = new GenericXmlApplicationContext("applicationContext.xml"); 
    SomeClass someClass = (SomeClass) appContext.getBean("someClass"); 
    someClass.someMethod(); 
    ... 

public class SomeClass { 
    private ServiceFromTheOtherJar serviceFromTheOtherJar; 

    public SomeClass(ServiceFromTheOtherJar serviceFromTheOtherJar) { 
    this.serviceFromTheOtherJar = serviceFromTheOtherJar; 
    } 

    public void someMethod() { 
    serviceFromTheOtherJar.call(); 
    ... 

APPLIC 종속 항아리에서 서비스를 호출하는 클래스의 주요 응용 프로그램 주요 응용 프로그램의 ationContext.xml

<bean name="serviceFromTheOtherJar" class="com...ServiceFromTheOtherJar"/> 

<bean name="someClass" class="com...SomeClass"> 
    <constructor-arg ref="serviceFromTheOtherJar"/> 
</bean> 

속성 값을 포함 종속 항아리

public class ServiceFromTheOtherJar { 

    private String someFieldWeWantToFillFromPropertyFile; 

    public void setSomeFieldWeWantToFillFromPropertyFile(String someFieldWeWantToFillFromPropertyFile) { 
    this.someFieldWeWantToFillFromPropertyFile = someFieldWeWantToFillFromPropertyFile; 
    } 

    public void call() { 
    //we would like to use the filled someFieldWeWantToFillFromPropertyFile here 
    ... 

물론 우리가 종속 항아리에 application.properties 파일이있는 서비스 클래스, 즉 우리 someFieldWeWantToFillFromPropertyFile에 주입하고 싶습니다.

이제 우리는 종속 항아리를 주 앱에 종속물로 추가 할 수 있습니다. 메인 애플리케이션이 실행될 때 Spring 컨텍스트가 올바르게 설정되고 ServiceFromTheOtherJar.call() 메서드가 예상대로 호출됩니다. 그러나 someFieldWeWantToFillFromPropertyFile는 우리가 지금까지 시도 어떤 속성 파일에서 작성되지 않습니다 (예를 들어 @PropertySource ({ "application.properties"}) 등 Environment.getProperty (...))

제한

  • 우리는 두 항아리 모두에서 스프링 3 버전을 사용하고 있으며, 이는 전개 환경으로 인해 유지되어야한다. 그래서 Spring 4 솔루션은 문제가되지 않는다.

  • 위에서 보았 듯이, 메인 애플리케이션은 현재 GenericXmlApplicationContext를 사용하며, 이는 애플리케이션의 중요한 재 작성을 나타내는 것으로 보인다. 따라서. 이 applicationContext.xml에 다음 콩을 추가 당신이 가지고있는 특성 파일의 값을 읽으려면 실행 및 환경 설정

답변

1

동안 BeanCreationException 원인이 있기 때문에하지 ServiceFromTheOtherJar에 @Service 어노테이션을 사용할 수있을 것 같았다. application.properties 파일을 가정

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations" value="classpath:application.properties" /> 
</bean> 

는 서비스 빈의 정의를 찾습니다이

<bean name="serviceFromTheOtherJar" class="com...ServiceFromTheOtherJar"> 
    <property name="someFieldWeWantToFillFromPropertyFile" value="${myValue}" /> 
</bean> 

이제 봄처럼 확장으로한다이

myValue=Hello World 

같은 정의를 포함 classpath에 application.properties-file을 추가하고 myValue에 따라 서비스 bean의 속성을 설정하십시오.

+0

작동합니다. 감사합니다. 하지만 건축/sw 원칙의 관점에서도 괜찮은지 궁금합니다. 여기서 main jar는 의존성 jar의 등록 정보 파일을 액세스하고 주입을 관리한다는 것을 의미합니다. Dependency Jar 내에서 처리되는 주석 솔루션을 찾았습니다. 자체 Configuration/ComponentScan 파일이 있고 Service 클래스는 값이있는 주입을 관리합니다. 불행히도 나는 작동하는 XML 솔루션을 찾을 수 없었다. 예 :main jar는 서비스 빈 + 프로퍼티 인젝션을 선언하는 의존성 jar 자신의 XML 컨텍스트를 가져올 수 있지만 실행 중에 인젝션은 발생하지 않습니다 .. – hammerfest

+0

서비스 빈의 컨텍스트를 정의하고 프로퍼티를 읽기위한 다른 빈을 정의 할 수 있습니다 종속성 jar에있는 자체 XML 파일 (service-context.xml)에 저장하십시오. 메인 컨텍스트를 정의하는 파일은 다른 파일을''과 함께 포함 할 수 있습니다. – jaysee

+0

예, 이전에 언급 한 내용은 시도했지만 작동하지 않는 이유가 있습니다. 그것은 컴파일되고 컨텍스트 빌드 업은 성공적이지만, 실행 중에 프로퍼티 값이 주입되지 않습니다 .. – hammerfest