2 回答

TA貢獻(xiàn)1783條經(jīng)驗 獲得超4個贊
SpringContextUtil不應(yīng)該像您正在做的那樣靜態(tài)訪問...因為您將其定義為@Component執(zhí)行以下操作;
@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 注入,而是簡單地靜態(tài)訪問,因此applicationContext它的內(nèi)部被忽略并且在您的情況下為 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");
}
}
這里L(fēng)ogger將是 null,當(dāng)ExampleService構(gòu)造函數(shù)被觸發(fā)時,因為構(gòu)造函數(shù)在注入開始之前被調(diào)用,但是如果您通過所述構(gòu)造函數(shù)合并注入,則可以合并此行為,如下所示;
@Service
public class ExampleService {
private final Logger logger;
public ExampleService(Logger logger) {
this.logger = logger;
logger.info("Im working");
}
}
完美運行,沒有任何問題......

TA貢獻(xiàn)1777條經(jīng)驗 獲得超3個贊
您永遠(yuǎn)不應(yīng)該像使用 this 那樣以編程方式訪問 bean SpringContextUtil
,只需注入MarketDataRobot
的構(gòu)造函數(shù)MdspiImpl
就可以了(因為它被注釋為@Service
)。首選的方法是使用構(gòu)造函數(shù)注入而不是字段注入,這將使您更容易編寫單元測試。@Autowired
如果你只有一個構(gòu)造函數(shù),你也可以去掉。
添加回答
舉報