我已经实现了一种策略模式,期待使用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对象而不是创建我们自己的对象之后,它就可以工作。
答案 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