EnableAutoConfiguration spring注释如何工作?

时间:2014-06-22 13:12:54

标签: java spring spring-boot

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

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

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

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

2 个答案:

答案 0 :(得分:18)

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

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

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

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

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

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

logging.level.org.springframework.boot=DEBUG

application.properties和Spring Boot会很乐意详细报告自动配置的内容以及什么不是

答案 1 :(得分:7)

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