淺談Spring依賴注入靜態成員變數
阿新 • • 發佈:2018-12-09
Spring的依賴注入是基於bean物件注入屬性;如果在一個類中定義了一個static修飾的成員變數,那麼這個變數就是屬於類的,無法完成依賴注入
eg:
假設在xml配置檔案已經配置了SolrTemplate物件
@Autowired
private static SolrTemplate solrTemplate;
//main方法...
main(){
//控制檯永遠會報java.lang.NullPointerException
solrTemplate.getById("1",TbItem);
}
解決方案一: xml方式實現
//xml中的配置 <solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" /> <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate"> <constructor-arg ref="solrServer" /> </bean> <bean id="solrUtil" class="com.baidu.util.SolrUtil" init-method="init"> <
property name="solrTemplate" ref="solrTemplate"></property> </bean> //SolrUtil中的配置 public class SolrUtil{ private static SolrTemplate solrTemplate; private void init(){ //在spring bean配置了初始化的方法 //this代表spring容器中的bean物件,意思是將this物件中的solrTemplate屬性賦值給SolrUtil.solrTemplate SolrUtil.solrTemplate = this.solrTemplate; } } 測試類: main(){ SolrUtil.solrTemplate.getById("1",TbItem); }
解決方案二: @PostConstruct註解實現
//xml中的配置
<solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" />
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer" />
</bean>
<bean id="solrUtil" class="com.baidu.util.SolrUtil">
<property name="solrTemplate" ref="solrTemplate"></property>
</bean>
//SolrUtil中的配置
public class SolrUtil{
private static SolrTemplate solrTemplate;
@PostConstruct
private void init(){
SolrUtil.solrTemplate = this.solrTemplate;
}
}
測試類:
main(){
SolrUtil.solrTemplate.getById("1",TbItem);
}
@PostConstruct註解完成對靜態成員變數的注入實現方式跟xml方式差不錯,只是用這個註解代替了配置bean物件中的init方法
解決方案三: set方法上加@Autowired實現
@Component
public class SolrUtil{
private static SolrTemplate solrTemplate;
@Autowired
public void setSolrTemplate(SolrTemplate solrTemplate) {
SolrUtil.solrTemplate = solrTemplate;
}
}