Как вызвать @injected класс - PullRequest
0 голосов
/ 18 июня 2020

Я начал работать над Java репо (впервые вижу Java), и у меня много проблем с самыми тривиальными вещами. Они используют Maven, а каждый класс использует @injected. Так, например, мне нужно запустить метод doSomething класса B внутри A:

import javax.inject.Inject;
import javax.inject.Named;
import a_path.B;

@Named
public class A {
    @Inject
    protected B b;

    public void method() {
       b.doSomething();
    }
}
import javax.inject.Inject;
import a_path.C;


class B {
    @Inject
    protected C c;

    public void doSomething() {
       c.anotherMethod();
    }
}

Итак, хорошо, чтобы внести некоторые изменения в doSomething, я создаю main метод для проверки моих изменений внутри класса A вот так:

import javax.inject.Inject;
import javax.inject.Named;
import a_path.B;

@Named
public class A {
    @Inject
    protected B b;

    public static void main(String[] args) {
       A a = new A();
       a.b.doSomething();
    }

    public void method() {
       b.doSomething();
    }
}

И я получаю Exception in thread "main" java.lang.NullPointerException, печатаю b и это null. Итак, что я предполагаю после многих головных болей, так это то, что @inject творит какое-то волшебство c, о котором мне нужно знать, чтобы заставить его работать. По сути, каждый объект @inject равен null, когда я пытаюсь использовать их в main. Мой вопрос в том, как правильно работать внутри объектов main @injected. Дайте мне знать, если вам понадобится больше контекста, и спасибо!

1 Ответ

1 голос
/ 18 июня 2020

Этот "magi c" называется Внедрение зависимостей . Способ получения экземпляров объекта зависит от используемого фреймворка (Spring, Guice, Dagger и т. Д. c). Посмотрите на зависимости maven, чтобы выяснить, какая из них используется.

Например, если используется Guice, а не для получения A, вам нужно сначала получить Injector:

public static void main(String[] args) {
  Injector injector = Guice.createInjector(); // may require module(s) for C
  A a = injector.getInstance(A.class);
  a.b.doSomething();
}

эквивалент Spring :

public static void main(String[] args) {
  ApplicationContext ctx = new AnnotationConfigApplicationContext(A.class, B.class, C.class);
  // or AnnotationConfigApplicationContext("package of A, B, C");

  A a = ctx.getBean(A.class);
  a.b.doSomething();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...