Spring依赖注入,带来的数据初始化问题

applicationContext.xml配置文件
1.举个例子:
<bean id="AService" class="com.backgroud.restful.AService">
</bean>
<context:component-scan base-package="com.front.restful" />
<bean id="BService" class="com.backgroud.restful.BService">
</bean>

初始化顺序:
1.先初始化AService
2.再初始化com.front.restful包下的service类
3.最后才初始化BService
xml里面配置的bean,和注解扫描的包中的bean,初始化的顺序,
是交叉依次执行的

拓展应用:
假如存在一个系统数据字典变量 jdbcUrl,默认是null值,它的初始化动作,交由com.front.restful包下的Rservice类进行初始化,而后续BService引用该数据字典变量 jdbcUrl 时,则能获取到非空值,从而进行业务操作。(静态变量,之所以用bean初始化,是因为有的就是需要读数据库,然后进行值初始化,而不是一个简单的常量,直接在代码里面写死,这个地方需要注意一下,在这也不进行这种初始化方式的评判,更多的是说明问题。。)

2.引入的bug:
有些service初始化时,不一定是按xml配置的bean依次执行,
举个例子:
<bean id="AService" class="com.backgroud.restful.AService">
<property name="BService" ref="BService" />
</bean>
<context:component-scan base-package="com.front.restful" />
<bean id="BService" class="com.backgroud.restful.BService">
</bean>

初始化顺序
1.先初始化AService
2.依赖注入原因,直接初始化BService
3.再初始化com.front.restful包下的service类

比较:
xml里面配置的bean,和注解扫描的包中的bean,初始化的顺序,
已经不是按照xml配置的顺序执行了,这个时候就有可能引入bug。

拓展应用中的bug:
存在一个系统数据字典变量 jdbcUrl,默认是null值,它的初始化动作,没有先交由com.front.restful包下的Rservice类进行初始化,而是直接被后续BService,引用了该数据字典变量 jdbcUrl ,从而获取到了空值,最终影响了业务的正常逻辑操作。

结论:
1.这是一个比较难以发现的bug问题,如果现实开发中,如果一开始AService,没有依赖BService,则不会有jdbcUrl,初始化为空值的现象。
2.但是随着业务的增长,有可能AService需要对BService进行引用,这个时候就会突然出现jdbcUrl初始化为空值的问题,这个时候,在这个问题解决的进程中,开发人员花销的时间也因人而异,但无疑是痛苦的。
3.这是一种比较浅的引用关系,设想一下,如果xml配置如下:
<bean id="AService" class="com.backgroud.restful.AService">
<property name="CService" ref="CService" />
</bean>
<context:component-scan base-package="com.front.restful" />
<bean id="BService" class="com.backgroud.restful.BService">
</bean>
<bean id="CService" class="com.backgroud.restful.CService">
<property name="BService" ref="BService" />
</bean>

那么由于业务的增长,AService需要对CService进行引用,从而造成了BService的提前初始化,进而影响了jdbcUrl的值初始化,这种问题的解决难度,无疑又往上增加。

而且随着xml的各种依赖注入层级增加,到最后,可能会发现不了问题代码,或者找到了问题代码,因为没有洞悉引用逻辑,也成为了一道无法解决的题,最终只能进行代码回退来解决。

解决:
这种问题,在现实开发中,是有可能能遇到的,如果把静态变量的初始化工作bean,直接放在xml定义的最前面,基本便能解决了。但是因为很多时候,我们没有注意到这个问题,便会带来不必要的麻烦。
如:
<context:component-scan base-package="com.front.restful" />
<bean id="AService" class="com.backgroud.restful.AService">
<property name="CService" ref="CService" />
</bean>
<bean id="BService" class="com.backgroud.restful.BService">
</bean>
<bean id="CService" class="com.backgroud.restful.CService">
<property name="BService" ref="BService" />
</bean>
最后, 有则改之,无则加勉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值