前言
在有些场景下,我们需要对类中的静态属性赋值,比如在设计一个基础公共功能的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 { |
示例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容器中获取对象时初始化此对象;