1. 程式人生 > >淺談Spring依賴注入靜態成員變數

淺談Spring依賴注入靜態成員變數

   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;
	} 
}