spring生命周期
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等等非常有用的工厂后处理器 接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。
最终的解决办法
最后是,虽然能够得到bean,但是这个bean不是已经被自动注入配置文件信息的那个bean。
所以不要也罢。
比较理想的办法就是找出EnableConfigurationProperties的实现,然后把他的代码跑一遍,这样就生成我要的bean了。
还有一个问题:
在这个地方(AutoMapperScannerConfigurator)使用autowired会报错,而在另外一个bean里(MasterDB)不会,这个很是奇怪。
他们的区别也只是MasterDB多实现了一个接口,然后他的类名是在DatasourceProperties之后的,不过我也试过改名字,好想没啥影响。
最后我还是先使用了工具类来读取properties,先让它跑起来。等到后面再想想有没有更好的解决方案。
下次要解决的就是配置多个datasource的问题了。
spring生命周期的更多相关文章
- 说下spring生命周期
面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧 Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName java.后端开发.程 ...
- Spring生命周期详解
导读 Spring中Bean的生命周期从容器的启动到停止,涉及到的源码主要是在org.springframework.context.support.AbstractApplicationContex ...
- Spring学习总结(4)-Spring生命周期的回调
参考文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans ...
- 【源码】spring生命周期
一.spring生命周期 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用crea ...
- Spring生命周期 Constructor > @PostConstruct > InitializingBean > init-method
项目中用到了 afterPropertiesSet: 于是具体的查了一下到底afterPropertiesSet到底是什么时候执行的.为什么一定要实现 InitializingBean; **/ @C ...
- spring 生命周期最详解
转载. https://blog.csdn.net/qq_23473123/article/details/76610052 目的 在大三开始学习spring时,老师就说spring bean周期非常 ...
- spring生命周期流程图
Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...
- spring源码学习(四)-spring生命周期用到的后置处理器
生命周期的九大后置处理器 第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory# ...
- 七、spring生命周期之初始化和销毁方法
一.通过@Bean指定初始化和销毁方法 在以往的xml中,我们是这样配置的 <bean id="exampleInitBean" class="examples.E ...
随机推荐
- Win7以上 32/64位系统隐藏托盘图标
前两天有朋友找我,让帮忙写个小工具,隐藏windows的托盘图标,想想最近在家也不想做太复杂的事,也好几年没写过windows上的小工具了,就答应了.想来挺简单的事,没想到还是有点小插曲的.特地来博客 ...
- Direct3D11学习:(八)Effects介绍
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Effects框架是一组用于管理着色器程序和渲染状态的工具代码.例如,你可能会使用不同的effect绘制水.云. ...
- jquery选中下拉列表的某个值
$('#villageToiletAnn').val('xxx'); id是select的ID,不是option的ID
- Windows及Linux平台下的计时函数总结
本文对Windows及Linux平台下常用的计时函数进行总结,包括精度为秒.毫秒.微秒三种精度的各种函数.比如Window平台下特有的Windows API函数GetTickCount().timeG ...
- MySqlConnection 并发连接的问题
最近在做项目的过程中遇到一个MySql在并发时初始化的问题,场景是这样子的: 我在Job中设定在同一时间点启动多个操作来访问数据库更新数据,结果在创建连接的时候抛出下面的问题: Note that w ...
- .NET中Main函数使用小技巧
摘要:任何语言开发出来的程序,都会有一个程序入口函数,可能每个语言所使用的程序入口函数名称不一样,但是它们的作用都是一样的,都是被操作系统去调用.那么本文主要总结.NET中的程序入口函数Main使用的 ...
- WebApi 登录身份验证
前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权 ...
- 关于 hangfire 的权限问题
hangfire 是一个分布式后台执行服务. 官网:http://hangfire.io/ 我看中hangfire的地方是 1:使用简单 2:多种持久化保存方案.支持sqlserver ,msmq等 ...
- 如何在ASP.Net中实现RSA加密
在我们实际运用中,加密是保证数据安全的重要手段.以前使用ASP时,对数据加密可以使用MD5和SHA1算法,这两种算法虽然快捷有效,但是无法对通过它们加密的密文进行反运算,即是解密.因此需要解密数据的场 ...
- 3kb jQuery代码搞定各种树形选择。
自制Jquery树形选择插件. 对付各种树形选择(省市,分类..)90行Jquery代码搞定,少说废话直接上插件代码.稍后介绍使用说明.是之前写的一个插件的精简版. 1.Jquery插件代码 /* * ...