Github地址


最近在整合mybatis-spring。

公司里面已经有一个叫做kylin-datasource的开发包,以前能够提供master和slave2个数据源,最近更新了2.0版本,支持自动扫描mapper了(之前每写一个mapper都要自己去配个factory)。

在毕业设计的项目里面,我也准备自己写一个mybatis与spring整合的依赖,并且希望在这个包原有的基础上,写的尽量完善一些。

同时也是为了能够更加深的去了解spring的原理。

自己建项目,将源代码类一个个拷过来,运行的时候,还是报错了:原先有3个datasouce,datasource\masterDatasource\slaveDatasource,所以在注入的时候找到了3个,spring不知道该怎么办了。

只好将所有slave相关的先删了,保证能够访问数据库先再说。

中间虽然也遇到了非常多的问题,但最终还是让一个master的依赖可用了。同时,我也对原先的代码一顿改,改成我看的习惯的样子。。


加载配置文件

这是今天遇到的主要问题:

使用@EnableConfigurationProperties 让properties中的属性自动注入到bean的属性中,这个bean叫做DatasourceProperties。

这种方法看上去非常优雅,,我也不想舍弃。

再后面的代码中又有用到DatasourceProperties的,里面用的是

@Autowired
private DatasourceProperties datasourceProperties;

这样就直接可以使用了,但是也有同样用到配置属性的,但是却没有用这种方法,用的是

@Bean
Properties datasourceConf() throws Exception {
PropertiesFactoryBean factoryBean = new PropertiesFactoryBean();
factoryBean.setLocation(new ClassPathResource("datasource.properties"));
factoryBean.afterPropertiesSet();
return factoryBean.getObject();
}
...datasourceConf().getProperty("datasource.master.basePackage")..

这相当于之前的配置是通过spring来的,非常优雅;而这里又回到了解放前,通过getProperty又来了一次。

所以我就把上面贴的这个方法给去了,也改成autowired的DatasourceProperties。

但是这一改就出事了,运行的时候报了空指针,打印出来一看是DatasourceProperties没有autowired进去。

那我就想,这个spring肯定是先先将bean给生出来,然后第二步才去autowaird,而调用这个方法生成bean的时候还没autowired所以就报错了。

得想个办法让那个properties先加载起来,然后后面的再去使用它。

为此,去查了spring生命周期相关的资料。

下面贴上


生命周期

1.图

2.接口方法分类

Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:

1)、Bean自身的方法  :  这个包括了Bean本身调用的方法和通过配置文件中的init-method和destroy-method指定的方法

2)、Bean级生命周期接口方法  :  这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法

3)、容器级生命周期接口方法  :  这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。

4)、工厂后处理器接口方法  :  这个包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器  接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。

参考:Spring Bean的生命周期(非常详细)


最终的解决办法

最后是,虽然能够得到bean,但是这个bean不是已经被自动注入配置文件信息的那个bean。

所以不要也罢。

比较理想的办法就是找出EnableConfigurationProperties的实现,然后把他的代码跑一遍,这样就生成我要的bean了。

还有一个问题:

在这个地方(AutoMapperScannerConfigurator)使用autowired会报错,而在另外一个bean里(MasterDB)不会,这个很是奇怪。

他们的区别也只是MasterDB多实现了一个接口,然后他的类名是在DatasourceProperties之后的,不过我也试过改名字,好想没啥影响。

最后我还是先使用了工具类来读取properties,先让它跑起来。等到后面再想想有没有更好的解决方案。

下次要解决的就是配置多个datasource的问题了。

spring生命周期的更多相关文章

  1. 说下spring生命周期

    面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧     Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName java.后端开发.程 ...

  2. Spring生命周期详解

    导读 Spring中Bean的生命周期从容器的启动到停止,涉及到的源码主要是在org.springframework.context.support.AbstractApplicationContex ...

  3. Spring学习总结(4)-Spring生命周期的回调

    参考文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans ...

  4. 【源码】spring生命周期

    一.spring生命周期 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用crea ...

  5. Spring生命周期 Constructor > @PostConstruct > InitializingBean > init-method

    项目中用到了 afterPropertiesSet: 于是具体的查了一下到底afterPropertiesSet到底是什么时候执行的.为什么一定要实现 InitializingBean; **/ @C ...

  6. spring 生命周期最详解

    转载. https://blog.csdn.net/qq_23473123/article/details/76610052 目的 在大三开始学习spring时,老师就说spring bean周期非常 ...

  7. spring生命周期流程图

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  8. spring源码学习(四)-spring生命周期用到的后置处理器

    生命周期的九大后置处理器 第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory# ...

  9. 七、spring生命周期之初始化和销毁方法

    一.通过@Bean指定初始化和销毁方法 在以往的xml中,我们是这样配置的 <bean id="exampleInitBean" class="examples.E ...

随机推荐

  1. 【转载】关于shell中的basename

    转载自:http://blog.chinaunix.net/uid-20499529-id-1940182.html basename 是去除目录后剩下的名字example:shell>temp ...

  2. IE下点击scrollbar会导致焦点移动到body

    现象 IE这货果然与众不同,当光标焦点在input时,点击同页面内其他区域的scrollbar,会导致焦点移动到body,从而触发绑定在input上的blur事件,如果input中的值与之前不同,甚至 ...

  3. C# 获取磁盘空间大小的方法

    方法一:利用System.IO.DriveInfo.GetDrives方法来获取 /// /// 获取指定驱动器的空间总大小(单位为B) /// /// 只需输入代表驱动器的字母即可 (大写) /// ...

  4. WatiN框架学习二——对弹窗的处理

    以IE为例,WatiN处理弹出窗口: IE ie = new IE("string"); //打开指定web页 ie.Button(Find.ById("string&q ...

  5. sprint2 项目部署+展示

    项目展示网址: http://160q49b998.51mypc.cn/ (注:所有用户密码都为123456,校内断网时访问不了)

  6. 重构第16天 封装条件(Encapsulate Conditional)

    理解:本文中的“封装条件”是指条件关系比较复杂时,代码的可读性会比较差,所以这时我们应当根据条件表达式是否需要参数将条件表达式提取成可读性更好的属性或者方法,如果条件表达式不需要参数则可以提取成属性, ...

  7. wpf 下面用MVVC的RelayCommand命令引发的一个异常

    具体解决方法参见我的博问:https://q.cnblogs.com/list/myquestion

  8. C#学习笔记(1) --简叙.net体系结构

    1 C#与.NET的关系 (1) C#是专门为与Microsoft的.Net Framework一起使用而设计的. (2) C#是一种基于面向对象设计方法的的语言. (3) 需要注意的是,C#就其本身 ...

  9. 新学C#线程使用总结

    这两天在项目上需要使用多线程技术,研究了半天,碰到了一些问题,现在简要总结下. 线程的使用其实很简单,和JAVA里面差不多,但是还是有很多特别的地方,在C#中的线程,如果要对非线程创建的控件进行操作的 ...

  10. C#基础--之数据类型

    C#基础--之数据类型 摘自:http://www.cnblogs.com/tonney/archive/2011/03/18/1987577.html 在第一章我们了解了C#的输入.输出语句后,我这 ...