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

猜你喜欢

转载自blog.csdn.net/qq_42514129/article/details/84798223
今日推荐