2017-11-20 14 views
1

다른 서비스 클래스에 종속성으로 사용자 정의 클래스를 주입하려고하지만 작동하지 않습니다. 항상 NPE로 끝납니다. 여기 내 예 (간단한 자바 SE) ... 모든 실행 얻을대거 2와 함께 여러 서비스 클래스에 하나의 종속성

내 주요 클래스입니다

public class Main { 
     public static void main(String[] args) throws IOException, TimeoutException { 
      MyApplication MyApp = new MyApplication(); 
      MyApp.execute(); 
     } 
    } 

하여 MyApplication 클래스

public class MyApplication { 

    private MyApplicationComponent appComponent; 

    @Inject FooService fooService; 
    @Inject BarService barService; 
    @Inject BazService bazService; 

    public MyApplication() { 
     component = DaggerMyApplicationComponent.builder().build(); 
     component.inject(this); 
    } 

    public void execute() { 
     fooService.doStuff(); 
     barService.doStuff(); 

     // this will happen in the FooService construct, see below   
     // bazService.doStuff(); 
    } 
} 
사용하지 않고, 단검에 정의 된 구성 요소 및 모듈 클래스

@Inject 생성자 방식

@Singleton 
@Component(modules = {MyApplicationModule.class}) 
public interface MyApplicationComponent { 
    void inject(MyApplication application); 
} 

@Module 
public class MyApplicationModule { 
    @Singleton 
    @Provides 
    FooService provideFooService() { 
     return new FooService(); 
    } 

    @Singleton 
    @Provides 
    BarService provideBarService() { 
     return new BarService(); 
    } 

    @Provides 
    BazService provideBazService() { 
     return new BarService(); 
    } 
} 

MyApplicationModule 및 MyApp 사용 필요한 의존성을 제공하는 licationComponent는 Main.class 내에서 작동합니다. 또한 FooService 클래스 내에서 BazService를 사용하려고합니다. 따라서 @Inject 방법을 사용하여 FooService.class와의 종속성으로 정의합니다. 항상 Main.class가 실행하기 FooService.class

public class FooService { 
    @Inject BazService bazService; 

    public FooService(){} 

    public doStuff(){ 
     bazService.doStuff(); 
    } 
} 

내 BazService의 @Inject를 사용

인해 FooSerivce 클래스에 정의되지 않은 bazService로하는 NPE에서 끝납니다. 나는 어노테이션을 어디에도 추가하지 않았다는 것을 생각하지 않는다. 단검은 이런 식으로 작동하지 않을 것 같아요 ... 어떤 생각?

답변

0

FooService는 필드 주입을 통해 bazService를 주입하려고하지만이 상황이 발생하기 전에 bazService를 호출하려고합니다. FooService의 생성자에서 bazService.doStuff()를 호출하려면 생성자 삽입을 사용해야합니다.

+0

감사합니다. 네가 옳아! 나는 나쁜 예를 택한다. 마지막 코드 블록을 변경했습니다. FooService 내의 doStuff()는 이제 BazService 내의 동일한 메소드를 호출합니다. 작동하지 않습니다. :/ – l00kus

+0

여전히 NPE를 던지고 있습니까? 주사는 이제 괜찮아 질거야. – Dondump