不墨迹,上来直接给出答案:InitializingBean比JPA的注解(比如@Column、@Table)更先被classloader加载到JVM
测试环境:(就是我的本机)
那么问题来了,为什么我会来测试这个加载顺序呢?
昨天使用公司框架(封装springboot+mybatis)做一个项目,项目启动的时候需要进行一些操作,想到了实现InitializingBean接口,操作数据库返回结果自然想到JPA注解(实体类通过@Column、@Table注解)。但是再我调试的时候意外出现了,如下图:
查询的结果size正确,但是每个对象都是null的。第一反应mybatis的查询结果和实体类属性没有对应上,但是我检查了一遍又一遍,确定以及肯定是对应上的。
抱着试一试的态度再配置文件上加了:mybatis自动转换驼峰命名配置,再次启动竟然正确了。我也更加确定是查询结果和实体类属性没有对应上。mybatis自动转换驼峰命名配置如下:
mybatis:
configuration:
map-underscore-to-camel-case: true
但是注解明明写的都是对的,怎么没有对应上呢?我开始怀疑InitializingBean初始化的时候,JPA的注解还没有加载到JVM。于是直接导出俩个时刻的dump文件,结果如下:
InitializingBean实例化时dump文件,JVM没有找到Column
项目启动后dump文件:找到column
至此可以确定:InitializingBean在实例化的时候,JPA的注解还没有加载到JVM。导致字段和实体类属性没有对应上,因此数据库查询结果的size正确,但是每个对象都是null。