2014-07-16 3 views
3

내 매퍼 클래스에 종속성을 주입하고 싶습니다.하둡 매퍼의 의존성 삽입

예 매퍼 클래스 :

public class Mapper() { 
    private MyInterface myObject;  

    public void map() { 
     // Map code here 
    } 
} 

나는 Spring을 사용 인 myObject하는 MyInterface의 구현을 주입하고 싶습니다. Hadoop 프레임 워크 자체가 Mapper Objects를 인스턴스화하기 때문에 Spring을 직접 사용하는 것은 불가능합니다. 이 작업을 수행 할 수있는 더 나은 방법이 있나요

public void configure() { 
    // create application context here, then 
    myObject= (MyInterface) applicationContext.getBean("bean.myImplementation1"); 
} 

:

는 유일한 방법 좀 위로가 다음과 같이 할 내 매퍼 클래스 &에 구성 기능을 추가하는 것입니다 수 있습니까?

미리 감사드립니다.

+0

나는 다음과 같은 문장을 이해할 수 없다 ** 내가 ** A의 설명을 yuo 수 스프링 사용 MyObject를 위해하는 MyInterface의 구현을 주입하고 싶습니다 더 좋은 방법? – Skizzo

+0

@Skizzo : 안녕하세요. MyInterface, imp1 및 imp2의 2 가지 구현이 있다고 가정 해 보겠습니다. 런타임에 myObject 변수에 그 중 1 개를 주입하도록 선택할 수 있습니다. 보통 봄 콩을 주사하여 가능합니다. – Water

답변

1

통해 갔다 사용할 수 있습니다 (난 당신이 봄에 XML 구성을 가지고 supponing있어)이 객체를 삽입 할 수 있습니다 Hadoop에 관한 몇 권의 책. 'configure()'메소드가이를 수행하는 유일한 방법 인 것처럼 보입니다.

은 이미 질문

-1

기본 주입 방식은 객체의 기본 유형입니다. 동일한 인터페이스의 두 가지 구현이 있기 때문에이 종류의 주입에는 사용할 수 없습니다. 그런 다음 경우에 다음과 같은 전략은

<beans> 
    <context:annotation-config/> 
    <bean class="example.MyFirstImpl"> 
    <qualifier value="first"/> 
    </bean> 
    <bean class="example.MySecondImpl"> 
     <qualifier value="second"/> 
    </bean> 
    <bean class="example.TestComponent" /> 


</beans> 

이 그런 다음 인터페이스는

public class TestComponent { 

     @Autowired 
     @Qualifier("first") 
     MyInterface myInterface 

} 
+0

다른 질문에 대답했다고 생각합니다. 문제는 종속성을 주입하는 방법을 알고 싶어합니다. Hadoop 프레임 워크는 DI 프레임 워크를 사용하여 맵퍼/축소 기 (reducer)를 인스턴스화하지 않기 때문에 가능하지 않습니다. Hadoop 매퍼에 @Autowired를 추가해도 Hadoop 매퍼를 실행합니다. –

1

매퍼 및 감속기는 프레임 워크에 의해 당신을 물려 있기 때문에 이것은 하둡에 대한 공통의 딜레마에 코드를 추가했다. 나는 setup() 메소드에서 경량 DI 프레임 워크를 호출하는 것이 가장 좋았다. 내 블로그 게시물 Dependency Injection on Hadoop에 대해 읽어보십시오. DITH를 다루기 위해 Spit-DI이라는 하나의 클래스를 작성했습니다.이 클래스는 github에서 사용할 수 있으며 JSR-250 @Resource 주석을 사용하여 주입 할 수 있습니다.

그것은이처럼 보이는 끝 : 는

class MovieMapper extends Mapper { 
 
    @Resource 
 
    private Movie movie; 
 

 
    @Override 
 
    protected void setup(Context context) { 
 
     DependencyInjector.instance().using(context).injectOn(this); 
 
    } 
 
} 
 

 
class Movie { 
 
    @Resource 
 
    private Counter numMoviesRequested; 
 
    
 
    public Integer getYear(String title) { 
 
    numMoviesRequested.increment(1); 
 
    // more code... 
 
    } 
 
} 
 

 
/** 
 
* You can have a wrapper class around Spit-DI for all your configuration. 
 
* (We have a TestDependencyInjector as well for the context of unit testing.) 
 
*/ 
 
class DependencyInjector { 
 
    private SpitDI spit = new SpitDI(); 
 

 
    public void injectOn(Object instance) { 
 
     spit.inject(instance); 
 
    } 
 

 
    public DependencyInjector using(final Mapper.Context context) { 
 
     spit.bindByType(Movie.class, new Movie()); 
 
     spit.bindByName(Counter.class, "numMoviesRequested", context.getCounter("movies", "numMoviesRequested"); 
 
     return this; 
 
    } 
 
}