【问题标题】:How to override spring beans with Java config如何使用 Java 配置覆盖 Spring bean
【发布时间】:2017-09-28 18:41:09
【问题描述】:

我在尝试覆盖 spring zuul 中定义的 RibbonRoutingFilter bean 时遇到了这个问题。需要强调的是,我正在做一个覆盖,而不仅仅是创建一个相同类型的 bean。所以一天结束时,我希望 zuul 的“ribbonRoutingFilter”bean 根本没有注册。

所以我有自己的实现。我尝试的第一件事是使用@component 注释并自动装配依赖项。在构造函数中添加了一个断点,它最终从未被调用过。所以我意识到我的定义必须比zuul的更早加载。所以我用@Configuration注解和@Order(Ordered.HIGHEST_PRECEDENCE)创建了一个配置类,并使用@Bean注解在那里实例化我的类。尽管如此,我的方法总是提前加载。

【问题讨论】:

    标签: java spring overriding config javabeans


    【解决方案1】:

    事实证明,在加载配置类定义时,Spring 遵循一定的顺序,这就是发生覆盖的地方。 org.springframework.context.annotation.ConfigurationClassParser 类在方法 doProcessConfigurationClass() 中有详细的逻辑。我将把我的简化总结或排序规则放在这里:

    1. 如果您的应用程序类(定义 main() 方法的地方)定义了任何类,则首先解析它们并在其中注册定义
    2. 然后它将注册 Bean 定义为 @component 并定义在 @Configuration 类中
    3. 然后它将添加由@Import 引入的定义
    4. 然后它将添加由@ImportResource 引入的定义
    5. 然后从应用程序类中的@bean 方法添加定义
    6. 然后从接口上的默认方法(我认为是 java 8)
    7. 然后尝试对您的应用程序类扩展的任何父类执行上述相同步骤。

    这解释了为什么我的覆盖不起作用。这是因为我一直在尝试的只是第 2 步。但是 zuul 通过 @Import 定义了 bean,这是第 3 步。

    所以为了解决我的问题,我在那里向我的应用程序类添加了一个@Bean 注释方法,并按预期进行了实例化和覆盖。

    上述总结可能并不准确,它只是让您了解可能导致您的覆盖失败的原因。在尝试特定用例时,最好调试 ConfigurationClassParser。

    【讨论】:

    • 请按照 Stack Overflow 的问答格式回答您自己的问题。这不是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多