当我试图覆盖spring zuul中定义的RibbonRoutingFilter bean时遇到了这个问题。为了强调,我正在进行覆盖,而不仅仅是创建相同类型的bean。所以,我希望zuul的“ribbonRoutingFilter”bean根本没有注册。
所以我有自己的实现。我尝试的第一件事是,我使用@component注释并自动装配依赖项。在构造函数中添加了一个断点,它最终永远不会被调用。所以我意识到我的定义必须早于zuul加载。所以我使用@Configuration注释和@Order(Ordered.HIGHEST_PRECEDENCE)
创建了一个配置类,并使用@Bean注释在那里实例化我的类。不过,我的方法总是提前加载。
答案 0 :(得分:0)
事实证明,在加载配置类定义时,Spring会遵循一定的顺序,这就是覆盖发生的地方。类org.springframework.context.annotation.ConfigurationClassParser具有方法doProcessConfigurationClass()中的详细逻辑。我将简化摘要或订购规则放在这里:
这解释了为什么我的覆盖不起作用。这是因为我一直在尝试的是在第2步。但是zuul通过@Import定义了bean,这是第3步。
因此,为了解决我的问题,我在我的应用程序类中添加了一个@Bean注释方法,并按照预期执行实例化和覆盖。
上述摘要可能不准确,它只是让您了解可能导致覆盖失败的原因。在尝试特定用例时,最好调试ConfigurationClassParser。