无法弄清楚如何在策略模式设计中进行依赖注入或自动装配

时间:2018-09-27 08:44:49

标签: spring spring-mvc autowired

我已经实现了一种策略模式,期待使用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的新手,由于接口实现和控制器类之间的关联,所以无法弄清自动装配部分

  

编辑:删除了循环关联

在从Spring bean周期获取Controller对象而不是创建我们自己的对象之后,它就可以工作。

1 个答案:

答案 0 :(得分:1)

首先,您应该在此处删除循环依赖性。 一种建议是从Controller类中删除private Interface behaviour ;并在Controller类之外的某个地方调用doBehaviour

完成后,您可以进入自动装配。基本是为了自动装配,spring上下文需要该特定类类型的bean。有几种方法可以根据您的班级进行操作

@Component
class Controller {

@Component注释。

  

注意:在您的应用程序类中应该有一个   @ComponentScan("relevant.package")指示在哪里可以找到bean的春季上下文。

一旦创建了bean,就可以按以下步骤自动装配

@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

有关更多信息,请read