@AutoConfigureAfter失效问题

环境:

开发:
1、windows平台
2、JDK1.8 (oracle)

线上:
1、ubuntu平台
2、Openjdk 8

公共:
1、spring cloud框架
2、连接db模块引用外部公共模块
3、工具类自动扫描实体层,生成ResultMap,与具体的Application启动类放在同一目录下
4、项目结构如下


structure架构.png

遇到的问题:

    windows平台运行微服务正常,服务器上扫描子包时出现\color{red}{找不到ResultMap}的情况,导致无法注入mapper的情况?
如下图:

log日志.png

util工具.png

推测问题的原因:

1、可能环境windows平台为oracle jdk1.8,服务器平台为OpenJDK 8,底层JVM实现不一致(暂无法考究)
2、\color{red}{可能注入的顺序不一致}
-> 引申为@AutoConfigureAfter与@ComponentScan冲突
-> @AutoConfigureAfter是\color{red}{自定义}顺序
-> @ComponentScan是\color{red}{自动扫描}控制顺序
-> 所以可能导致@AutoConfigureAfter失效问题

解决方案:

A、加入@Order注解或@AutoConfigureOrder指定顺序,设置为最高优先级
-> 无果,最终还是跳过MyBatisTypeMapScannerConfig,直接扫描了子包的类

B、@AutoConfigureOrder与spring.factories配置文件配合使用

C、 在启动类注入自定义的工具类(暂时选用了这种方案,项目正常启动)
若加入@Lazy的注解,则一样报错
原因分析:添加ResultMap是放在构造方法里的,所以没有立即实例化一个bean的话,就会报错。变成static静态方法也不行,不能在类加载时生成。从此\color{red}{推测}可能是因为1原因中两个平台底层加载不一样,oracle1.8扫描到配置类会自动实例化,使用饿汉式模式,open jdk 8扫描到配置类直接装载类,使用懒汉式模式

 @Autowired
 private MyBatisTypeMapScannerConfig myBatisTypeMapScannerConfig;
总结

    通过多次测试,发现无论是在同一个微服务关系或是引用公共包关系下,@AutoConfigureAfter与@AutoConfigureBefore配置都无效,根据双亲委派机制,打包好的公共db模块的jar包应该先被加载,他们之间应该也不能使用这种指定顺序的操作,所以最终稳妥的办法还是自己自定义一个启动类的顺序的配置文件,保证其加载与运行的顺序,这样出现加载顺序错误导致无法启动项目的概率就能降低。还有可能就是底层创建对象的时机不一致。

    PS:才疏学浅,有些地方不是很严谨,若有不对的地方,希望能多多指教

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Java基础 1、Java中两种数据类型(为后面进一步提问做铺垫) (1)基本数据类型,分为boolean、b...
    编程侠Java阅读 4,447评论 0 13
  • Java 面试中的重要话题 除了你看到的惊人的问题数量,我也尽量保证质量。我不止一次分享各个重要主题中的问题,也确...
    hahaYXXXJ阅读 7,552评论 0 38
  • Spring-IOC 1、解析注册:使用Resource定位xml配置;使用BeanDefinitionReade...
    小丑的果实阅读 2,833评论 0 0
  • JVM-Class类文件结构 常量池:字面量(字符串和final常量)和符号引用(类和接口的全限定名、字段的名称和...
    小丑的果实阅读 5,801评论 0 0
  • 1.JVM 堆内存和非堆内存 堆和非堆内存按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据...
    yanzhu728阅读 4,453评论 0 0