Spring自动装配优先级

遇到问题

自己封装的stater,在改完代码后,网关跑不起来了。

改动点是@ComponentScan从xx.xx.core.utils改成xx.xx.**,因为当时要加一个xx.xx.core.uid,索性就把utils去掉了,改成通配。

结果网关跑起来后,报了个有两个object mapper的错。

定位问题

定位了一下代码,确实自定义了一个object mapper,上代码

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
@ConditionalOnClass(ObjectMapper.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@AutoConfigureBefore(org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration.class)
public class JacksonAutoConfiguration {
@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
// 简化代码
return new ObjectMapper();
}
}

包扫描改了后,扫到这个类了?但是为什么不扫到这个类的时候,可以跑?

猜想

报错,肯定生成了两个object mapper,那就意味着AutoConfigureBefore失效了。

把代码回滚后,重新跑了下,验证了AutoConfigureBefore确实是生效了,那这个时候明确了,就是AutoConfigureBefore失效了。

改个包扫描,为什么AutoConfigureBefore会失效?

查文档

查了下spring boot老的文档,找到功能页,搜索AutoConfigureBefore,看到一行关键文档。

1.jpg

开始翻译

Auto-configurations must be loaded that way only(自动装配类,必须由spring.factories提供,that就是上文的spring.factories)。

Make sure that they are defined in a specific package space and that they are never the target of component scanning(让你别扫到它,好吧。。)

Furthermore, auto-configuration classes should not enable component scanning to find additional components. Specific @Imports should be used instead.(要用一些bean,用import。)

结论

由此推断扫描的优先级要大于自动配置的类(直接生成了object mapper,并没有等jackson自动配置前)

只有自动配置的类才能生效AutoConfigureBefore,AutoConfigureAfter和AutoConfigureOrder应该也是(不扫到就能跑)

代码就不看了,太忙了。