2 回答
TA贡献1783条经验 获得超4个赞
SpringContextUtil不应该像您正在做的那样静态访问...因为您将其定义为@Component执行以下操作;
@Service
public class MdspiImpl extends CThostFtdcMdSpi {
@Autowired
private SpringContextUtil springContextUtil;
public MdspiImpl(CThostFtdcMdApi mdapi) {
m_mdapi = mdapi;
logger.info("MdspiImpl is creating...");
***mdr = springContextUtil.getBean("marketDataRobot");
}
}
由于SpringContextUtil不是通过 Spring 注入,而是简单地静态访问,因此applicationContext它的内部被忽略并且在您的情况下为 null。
同时去掉static修饰符;
@Component
public class SpringContextUtil implements ApplicationContextAware {
private ApplicationContext applicationContext;
// include getter/setter for applicationContext as well
public <T> T getBean(String name) {
return (T) applicationContext.getBean(name);
}
}
编辑
来自最新示例项目的麻烦;
@Service
public class ExampleService {
@Autowired
private Logger logger;
public ExampleService() {
this.logger=logger;
logger.info("Im working");
}
}
这里Logger将是 null,当ExampleService构造函数被触发时,因为构造函数在注入开始之前被调用,但是如果您通过所述构造函数合并注入,则可以合并此行为,如下所示;
@Service
public class ExampleService {
private final Logger logger;
public ExampleService(Logger logger) {
this.logger = logger;
logger.info("Im working");
}
}
完美运行,没有任何问题......
TA贡献1777条经验 获得超3个赞
您永远不应该像使用 this 那样以编程方式访问 bean SpringContextUtil
,只需注入MarketDataRobot
的构造函数MdspiImpl
就可以了(因为它被注释为@Service
)。首选的方法是使用构造函数注入而不是字段注入,这将使您更容易编写单元测试。@Autowired
如果你只有一个构造函数,你也可以去掉。
添加回答
举报