如何使用Java配置覆盖spring bean

时间:2017-09-28 18:41:10

标签: java spring override config javabeans

当我试图覆盖spring zuul中定义的RibbonRoutingFilter bean时遇到了这个问题。为了强调,我正在进行覆盖,而不仅仅是创建相同类型的bean。所以,我希望zuul的“ribbonRoutingFilter”bean根本没有注册。

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

1 个答案:

答案 0 :(得分:0)

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

  1. 如果您的应用程序类(其中定义了main()方法)中定义了任何类,则会对它们进行解析并首先在其中定义
  2. 然后它将注册Beans定义为@component并在@Configuration类
  3. 中定义
  4. 然后它将添加@Import
  5. 引入的定义
  6. 然后它将添加@ImportResource
  7. 引入的定义
  8. 然后在应用程序类
  9. 中添加@bean方法的定义
  10. 然后从接口上的默认方法(我认为它是java 8)
  11. 然后尝试对应用程序类扩展的任何父类执行相同的步骤。
  12. 这解释了为什么我的覆盖不起作用。这是因为我一直在尝试的是在第2步。但是zuul通过@Import定义了bean,这是第3步。

    因此,为了解决我的问题,我在我的应用程序类中添加了一个@Bean注释方法,并按照预期执行实例化和覆盖。

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