Невозможно понять, как сделать Dependency Injection или Auto-wiring в дизайне паттернов стратегии. - PullRequest
0 голосов
/ 27 сентября 2018

Я реализовал шаблон стратегии, для которого я с нетерпением жду возможности использовать инъекцию зависимостей в Spring.

У меня есть следующий вариант использования:

class Controller {
    @Autowired
    private Interface behaviour ;
    private String someData;
    // getters setters 

    public void doBehaviour(){
        this.behaviour.doBehaviour(someData); // getting null pointer here
    }
}

public Interface IBehaviour {
    void doBehaviour(String someData);
}
@Component
class MyCustomBehaviour1 implements IBehaviour {



    @Override
    void doBehaviour(String ){
        System.out.println("Playing with MyCustomBehaviour1 -> " + someData);
    }

}

My Main class -

public Main {
    AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    Controller ctrln = new Controller();
    ctrln.setBehaviour(); 
    ctrln.doBehaviour(); 
}

Как эффективно выполнять автопроводку / зависимостьИнъекция в этом случае или как я могу улучшить этот код?Я новичок в Spring, поэтому не могу разобраться с частью Autowiring из-за связи между реализацией интерфейса и классом контроллера

Редактировать: Удалена круговая связь

Сработало после получения контроллераобъект из цикла бобов весны вместо создания нашего собственного объекта.

1 Ответ

0 голосов
/ 27 сентября 2018

Прежде всего вы должны удалить циклическую зависимость здесь.Одно из предложений - удалить private Interface behaviour ; из класса Controller и вызвать doBehaviour где-нибудь за пределами класса Controller.

И как только вы закончите с этим, вы можете перейти к Autowiring.Основное для Autowire, контексту Spring нужен bean-компонент этого конкретного типа класса.Есть несколько способов сделать это в соответствии с вашим классом, вы можете просто поставить

@Component
class Controller {

@ Component annotion.

Примечание: в вашем классе приложения должен быть @ComponentScan("relevant.package"), указывающий контекст весны, где найти ваши бины.

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

@Component
class MyCustomBehaviour1 implements IBehaviour {

// instance of controller 
private Controller cntrlInstanceToUseData;

@Autowired
public MyCustomBehaviour (Controller ctrlInst){
    this.cntrlInstanceToUseData = ctrlInst;
}

@Override
void doBehaviour(){
    System.out.println("Playing with MyCustomBehaviour1 -> " + cntrlInstanceToUseData.getSommeData());
}
}

Теперь вам действительно не нужно создавать объект Controller и объект Behavior. Доступ к doBehaviour следует выполнять где угодно, используя

@Autowire
private IBehaviour myBehaviour

.больше информации, пожалуйста, прочитайте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...