【问题标题】:How does the EnableAutoConfiguration spring annotation work?EnableAutoConfiguration 弹簧注解是如何工作的?
【发布时间】:2014-06-22 13:12:54
【问题描述】:

我不喜欢过于抽象,而且我认为 Spring 犯下了重罪。

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

看看spring's own javadocs,除了说它会智能地猜测您需要什么以及对条件bean 做些什么之外,它并没有透露太多信息。

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

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    根据我作为 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。或者您可以使用@EnableAutoConfigurationexclude 字段的不太激烈的解决方案。例如,如果您希望 Spring Boot 自动配置除 ActiveMQ 之外的所有内容,则可以使用 @EnableAutoConfiguration(exclude=ActiveMQAutoConfiguration.class)

    在我看来,这里绝对没有重罪!您可以使用 Spring Boot 中的任何内容。当您不想要它提供的东西时,您可以轻松选择部分或全部退出!

    另外,如果您想深入了解一下,可以添加属性

    logging.level.org.springframework.boot=DEBUG

    application.properties,Spring Boot 很乐意提供一份详细报告,说明哪些是自动配置的,哪些不是

    【讨论】:

    • 好的,所以也许我有点过于戏剧化了。感谢您的信息!
    【解决方案2】:

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

    【讨论】:

    • 当某些东西没有按预期工作时,问题就来了。 @EnableAutoConfiguration 对于廉价的howto博客来说很好,但是在任何中等复杂的东西中调试真的很痛苦。如果您有链接,非常欢迎有关此注释的一些好的文档以及可以禁用的内容?
    • 我的答案中有一个链接。我们现在有很多相当复杂的应用程序正在生产中,@EnableAutoConfiguration 所以如果你顺其自然的话应该没问题。就像我说的,如果你不喜欢魔法,你总是可以不用它。
    • 谢谢,通过启用春季启动的调试,我最终在日志中找到了我想要的东西。我想禁用 BasicErrorController,因为我陷入了 Spring Security 重定向循环,我只想使用标准 Spring MVC 方法来处理我的错误
    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2016-11-22
    • 2011-01-02
    • 1970-01-01
    • 2015-10-22
    • 2019-03-19
    • 2012-12-06
    相关资源
    最近更新 更多