spring 静态属性注入

前言

在有些场景下,我们需要对类中的静态属性赋值,比如在设计一个基础公共功能的sdk时,有一个比较重要的原则是尽量减少对其他jar包的依赖,防止上层应用在引入sdk时,存在过多的maven版本不一致的冲突,导致程序运行出现NoClassFoundError异常。基于上述原则,现在的情况是此sdk需要获取上层应用中通过spring配置的动态数据源对象,但是又不想依赖Spring的相关jar。解决办法就是通过Spring的静态属性注入。

示例代码

这里采用的是构造函数的方式注入的,当然也可以采用setter方式注入。值得注意的是,这里要关闭lazy-init延迟初始化功能,因为,我们希望达到的效果是调用GatewayDataSourceManager.getDynamicDataSource()方法时,就需要返回动态数据源对象。如果采用延迟初始化注入的话,真正完成注入是第一次通过调用getBean()方法从Spring容器中获取gatewayDataSourceManager实例才进行注入的,这并不是我们想要的效果。所以,这里需要单独将此bean的lazy-init属性设置为false,采用即时初始化的方式。

public class GatewayDataSourceManager {

private static DynamicDataSource dynamicDataSource = null;

/**
* 动态数据源对象,在实际项目层,采用spring依赖注入
* @param dynamicDataSource
*/
public GatewayDataSourceManager(DynamicDataSource dynamicDataSource){
GatewayDataSourceManager.dynamicDataSource = dynamicDataSource;
}

/**
* 获取动态数据源实例
* @return
*/
public static DynamicDataSource getDynamicDataSource() {
return dynamicDataSource;
}

}

示例spring-context.xml:

<!-- 关闭延迟初始化 -->
<bean id="gatewayDataSourceManager" class="com.feidee.money.core.datasource.GatewayDataSourceManager" lazy-init="false">
<constructor-arg ref="dataSource_dyn" />
</bean>

总结

Spring的延迟初始化和即时初始化:

  • lazy-init=”false” ,即时初始化,在spring启动扫描spring-bean配置中的过程中完成bean的初始化工作,缺点是容器启动时间长;
  • lazy-init=”true”,延迟初始化,在应用程序第一次通过getBean()的方式从IOC容器中获取对象时初始化此对象;