Dagger2 : Dependency Injection

dagger2

  • 장점
    • 모든 instance 생성을 dagger2에 위임해버리면, activity나 application 생명 주기에 따라 instance를 관리해 줄 수 있음.
  • 사용법

1. 새로운 activity, fragment 등을 생성해서 객체 주입하는 시나리오

  • activity, fragment class 이름을 ExampleActivity.java라고 한다.
  • database에 접근하거나 할때, 필요한 *Service를 확인
  • 멤버 변수에 정의. (CustomerService, SaveService를 사용한다고 가정)
  • ApplicationComponent.javavoid inject(ExampleActivity target); 추가

BaseFA로 정의된 void inject(BaseFA target);가 있어도 void inject(ExampleActivity target);를 만드는 이유

  • dagger2가 Abstract로 상속받아 만든 class에 별도로 정의된 @Inject 할 멤버변수는 제대로 인스턴스 주입이 되지 않는다
  • ExampleActivity.java에서 inject 실행

  • fragment에서 inject도 동일한 방법으로 실행

    @Component(...)
    public interface ApplicationComponent {
       void inject(ExampleActivity target);
    }

    public class ExampleActivity extends BaseFA {
        @Inject
        CustomerService customerService;
         
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ((MyApplication) getApplicationContext()).getApplicationComponent().inject(this);
        }
    }

2. 인스턴스 하나만 주입하는 경우

    public class ExampleActivity extends BaseFA {
        private CustomerService customerService;
            
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            saveService = ((MyApplication) getApplicationContext()).getApplicationComponent().getSaveService();
        }
    
    }
  • ApplicationComponent.java에 정의한 SaveService getSaveService();을 통해서 인스턴스가 주입됨.