码迷,mamicode.com
首页 > 编程语言 > 详细

Spring 容器里的bean初始化回调方法研究(一)

时间:2015-10-24 23:30:40      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:


@Author xiejun
@Since 2015/10/24

感慨一下,曾经某内的讲师说spring bean的创建讲三天三夜也说不完,这种空话听的耳朵
起茧了,却还是不停地被人repeat,究其原因,o(︶︿︶)o 唉确实有的研究。

****
米字符号中是业务剥离
业务介绍:
系统a需要从另一个系统b批量获取到单号,然后存入数据库,当到使用时,a系统将单号与绑定信息回传给b系统。

在这个业务中可以把获取和存入数据库做成一个单独的服务,在后台线程中自动运行。介绍一下实现:
在容器初始化级别的listener里创建开启服务线程,注入该服务,启动线程。

该服务涉及到数据库操作,因为用的是mybatis的mapper.xml文件加操作接口访问的方式所以没有具体的可以new的DAO实现对象。
如此,在前面提到的服务中,就需要注入这个DAO接口,而不能直接new。
****

好问题来了:
在spring web context 容器创建的listener里匹配注入mybatis自动生成的接口实体。然后在这个服务中写一个method
对这个自动生成的实体执行操作,boom ~ ~NullPointerException。

debug:
数据库操作实体==null。

可以确定的是:被spring管理的bean的属性是可以被注入的,应该是方法执行到属性注入前面去了。

怎么解决:
服务所需的方法放到所有的bean属性注入完毕之后再执行。

spring容器所有bean都注入完,是有一个回调函数的。它就是afterPropertiesSet(),定义在spring的InitializingBean接口当中。
但是需要包含回调方法的类实现spring的接口。然后在afterPropertiesSet()中实现,可以看出这个是直接执行的,没有通过反射。
但是在服务层中耦合了spring的接口。这个服务模块,将不通用于非sring框架的应用,代码的重用性差。

那还有其他的实现方式吗:
answer:bingo!!
bean的xml配置 的init-method属性可以指定一个无参的初始化方法,在这个bean的所有属性注入完毕后再执行的方法。这个方法简直是给我的定制的哈哈。
或者javax的@PostConstruct注解指定类属性加载完毕后的回调方法,这两个一个作用。
需要注意的是这个方法,不需要对象去调,因为它会在对象初始化完毕后自动执行。

test:
在servletContextlistener中执行:
mybatis框架自动生成的数据库操作对象注入成功,DAO操作执行成功。

通过这个事件的研究也总结出来一个经验:
servletContextListener里执行的代码由于是web app创建时执行的代码,因此在执行中存在:当注入通过反射实现的bean时可能注入失败,或者该bean还未初始化。

结语:
spring bean 的属性和方法 在tomcat web context容器初始化完成后的顺序是按什么指定的求留言
有不对的地方,求斧正!

Spring 容器里的bean初始化回调方法研究(一)

标签:

原文地址:http://www.cnblogs.com/xiejunNO001/p/4907876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!