@AutoConfigureAfter失效问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@AutoConfigureAfter失效问题相关的知识,希望对你有一定的参考价值。

参考技术A 开发:
1、windows平台
2、JDK1.8 (oracle)

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

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

    windows平台运行微服务正常,服务器上扫描子包时出现 的情况,导致无法注入mapper的情况?
如下图:

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

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

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

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

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

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

以上是关于@AutoConfigureAfter失效问题的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 自定义starter @AutoConfigureBefore@AutoConfigureAfter@AutoConfigureOrder 不生效问题

springboot情操陶冶-@Conditional和@AutoConfigureAfter注解解析

au为啥加载音频错误

从 .au3 文件访问 .au3 文件

au和pr不互通是啥文件出了问题

通过我的 C# 代码自动编译 .au3 脚本