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