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
如果你只有一個構造函數,你也可以去掉。
添加回答
舉報