EnableAutoConfiguration spring注释如何工作?

我不喜欢粗略的抽象, 我认为Spring已经犯下了重大的重罪。

但是如果有人可以解释“自动”配置背后的算法,我愿意忽略它。

看看spring自己的javadocs ,除了说它会智能地猜测你需要什么以及对条件bean做些什么之外,它并没有给予太大的帮助。

有人知道用什么算法来确定需要加载的内容吗?

根据我作为Spring Boot用户的经验,Spring Boot决定启用哪些自动配置的基本因素是:

1)类路径上的类。 例如,如果存在RabbitMQ和Spring AMQP类,则将启用RabbitAutoConfiguration 。 相应的注释是@ConditionalOnClass

2)是否存在用户定义的bean。 例如,如果类路径上存在所有Spring Data JPA,则仅当用户尚未注册时,Spring Boot才会注册LocalContainerEntityManagerFactoryBean bean。 用户注册的bean将“覆盖”默认bean。 相关注释是@ConditionalOnMissingBean

正如@DaveSyer所提到的,如果你想自己包含相关的配置,你当然可以在没有@EnableAutoConfiguration情况下使用Spring Boot。 或者你可以使用@EnableAutoConfigurationexclude字段的exclude那么激烈的解决方案。 例如,如果您希望Spring Boot自动配置除ActiveMQ之外的所有内容,您将使用@EnableAutoConfiguration(exclude=ActiveMQAutoConfiguration.class)

在我看来,这里绝对没有重罪! 你可以使用你想要的Spring Boot。 如果您不想要它提供的东西,您可以轻松地部分或完全退出!

此外,如果您想了解封面,您可以添加该属性

logging.level.org.springframework.boot=DEBUG

application.properties和Spring Boot很乐意详细报告自动配置的内容和不自动配置的内容

Spring Boot Reference Guide中有一些文档。 它并不是非常复杂,我几乎不认为只是包含一堆你可能已经写过的@Configuration是重罪(因为它就是这样)。 如果您希望单独包含各个配置,请随意不要使用@EnableAutoConfiguration