我有一个工厂类,应该返回classA
或classB
的实例。这些类实现了接口XYZ
:
interface xyz;
getInstance()
@service
classA implements xyz{
public void checkStatus(){
}
}
@service classB implements xyz{
public void checkStatus(){
}
}
工厂类:
@component
class ABCFactory{
@Autowire classA A;
public static getInstance(str a){
return classA;
}
}
客户代码:
Class A a = ABCFactory.getInstance("A");
a.checkStatus();
我得到空指针异常 - 可能a
返回为null?
使用spring注释和自动装配的bean实现工厂模式的最佳方法是什么?
答案 0 :(得分:0)
很难确定为什么在没有看到你的Spring配置的情况下你的自动接线没有发生。我的第一个猜测是你没有打开组件扫描:
<context:component-scan base-package="org.example"/>
将类似内容添加到spring配置文件(使用正确的软件包)将告诉Spring扫描包结构中是否需要自动连接的字段,以及可用于自动连接的服务。
答案 1 :(得分:0)
static
是万恶之源。你是怎么设法在这里访问classA
的?
@Component
class ABCFactory{
@Autowire classA A;
public static getInstance(str a){
return classA;
}
}
A
字段不是静态的,而getInstance()
方法是 - 您的代码无法编译。
此外,依赖注入适用于实例,而不适用于static
类。因此你应该摆脱static
:
@Component
class ABCFactory {
@Autowire classA A;
public xyz getInstance(str a){
return A;
}
}
并将ABCFactory
注入您需要的位置(例如,在其他服务或控制器中):
@Autowired
private ABCFactory factory;
顺便说一句,你的设计在Spring环境中看起来很有用,你想要实现什么目标?