【发布时间】:2014-06-22 13:12:54
【问题描述】:
我不喜欢过于抽象,而且我认为 Spring 犯下了重罪。
但如果有人可以解释“自动”配置背后的算法,我愿意忽略它。
看看spring's own javadocs,除了说它会智能地猜测您需要什么以及对条件bean 做些什么之外,它并没有透露太多信息。
有人知道使用什么算法来确定需要加载的内容吗?
【问题讨论】:
标签: java spring spring-boot
我不喜欢过于抽象,而且我认为 Spring 犯下了重罪。
但如果有人可以解释“自动”配置背后的算法,我愿意忽略它。
看看spring's own javadocs,除了说它会智能地猜测您需要什么以及对条件bean 做些什么之外,它并没有透露太多信息。
有人知道使用什么算法来确定需要加载的内容吗?
【问题讨论】:
标签: java spring spring-boot
根据我作为 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。或者您可以使用@EnableAutoConfiguration 的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。
【讨论】:
@EnableAutoConfiguration 所以如果你顺其自然的话应该没问题。就像我说的,如果你不喜欢魔法,你总是可以不用它。