如何使用Java配置覆盖弹簧豆



当我试图覆盖Spring Zuul定义的RibbonRoutingFilter bean时,我遇到了这个问题。要强调,我正在做一个替代,而不仅仅是创建相同类型的豆子。因此,一天结束时,我希望Zuul的" RibbonRoutingFilter" Bean根本没有注册。

所以我有自己的实施。我尝试过的第一件事,我使用了@component注释并自动依赖。在构造函数中添加了一个断点,最终从未被调用。因此,我意识到我的定义必须比Zuul的定义加载。因此,我创建了一个带有@configuration注释和@Order(Ordered.HIGHEST_PRECEDENCE)的配置类,并使用@BEAN注释将我的类实例化。尽管如此,我的方法始终始终加载。

事实证明,加载配置类定义时有一定的顺序弹簧正在遵循,这就是替代的地方。类org.springframework.context.annotation.configurationclassparser具有详细的逻辑,方法是DoprocessConfigurationClass()。我将在此处放置简化的摘要或订购规则:

  1. 如果您的应用程序类(定义了main()方法)在其中定义了任何类
  2. 然后,它将注册定义为@component的bean,并在@configuration类中定义
  3. 然后,它将添加@Import介绍的定义
  4. 然后,它将添加@importresource介绍的定义
  5. 然后添加应用程序类中@BEAN方法的定义
  6. 然后是从接口上的默认方法(我认为是Java 8)
  7. 然后尝试为您应用程序类的任何父级课程进行相同的步骤。

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

因此,为了解决我的问题,我在我的应用程序类中添加了一个@bean注释方法,并进行了Instanciation,并且按预期的是覆盖。

上面的摘要可能不准确,它只会让您了解可能失败的替代。尝试特定用例时,最好调试ConfigurationClassParser。

最新更新