我不喜欢粗略的抽象,而且我认为Spring犯下了重大的重罪。
但如果有人能解释“自动”配置背后的算法,我愿意忽略它。
看一下spring's own javadocs,除了说它会智能地猜测你需要什么以及对条件bean做些什么之外,它并没有给予太大的帮助。
有人知道用什么算法来确定需要加载的内容吗?
答案 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
。