Подтвердить что ты не робот

Как я вставляю в сервлет с кинжалом 2?

Я спросил (и ответил) тот же вопрос для Dagger 1 здесь. Как мне сделать что-то подобное для кинжала 2, теперь ObjectGraph.inject больше не существует.

Этот вопрос может быть обобщен на:

Как вы выполняете операции с членами, если объект должен быть создан с помощью другой структуры? (в данном случае, контейнер Servlet).

4b9b3361

Ответ 1

Я пытался ответить на этот же вопрос. Я думаю, что я приблизился к тому, как это "должно" работать идеально, но я просто держусь за проект GitHub и пытаюсь понять его на основе обрывов информации там, так как большая часть документации для Dagger 2 по-прежнему (на этой неделе).

Мой примерный код ниже для Android-активности, но я считаю, что этот же подход должен работать на сервлет, о котором вы просите.

Добавить MemberInjector <... > в ваш интерфейс @Component; например, в следующем компоненте я добавил один для моего класса MainActivity:

package ...;

import javax.inject.Singleton;
import dagger.Component;
import dagger.MembersInjector;

@Singleton
@Component(modules = { PlaygroundModule.class })
public interface MainComponent {
    Wizard createWizard();
    MembersInjector<MainActivity> mainActivityInjector();
}

И затем в своем классе, который вы хотите вводить в члены, в подходящем месте после создания объекта, но прежде чем вам нужно будет использовать введенных членов, вам необходимо создать компонент и использовать инъекцию члена:

package ...;

// other imports
import javax.inject.Inject;
import dagger.MembersInjector;

public class MainActivity extends ActionBarActivity {

    @Inject
    Wizard wizard;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MainComponent c = DaggerMainComponent.create();
        c.mainActivityInjector().injectMembers(this);

        // other code...
    }
}

Единственное, что я не понимаю, - это правильная модель создания компонента внутри объекта, который должен быть впрыснут. Это не совсем правильно, но он все еще очень гибкий, поскольку вы привязываетесь только к компоненту, а не к модулю. Так что, возможно, это правильный подход, но, возможно, это немного не работает.

Ответ 2

Хотя я не очень доволен этим, так как мне приходится писать шаблонный код, что-то вроде этого работает с сервлетом.

public class MyServlet extends HttpServlet {

  @Inject
  MyService service;

  @Override
  public void init( ServletConfig config ) throws ServletException {
    super.init(config);
    this.service = MyDaggerComponent.create().injectMyService();
  }
}

Вы можете рассмотреть возможность установки экземпляра MyDaggerComponent в ServletContext, а затем получить его так, как в методе init():

((MyDaggerComponent)config.getServletContext().getAttribute("MyDaggerComponent")).injectMyService()