有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何用Java配置覆盖springbean

我在试图覆盖SpringZuul中定义的RibbonRoutingFilter bean时遇到了这个问题。强调一下,我正在做一个覆盖,而不仅仅是创建一个相同类型的bean。最后,我希望zuul的“ribbonRoutingFilter”bean根本没有注册

所以我有自己的实现。首先,我尝试使用@component注释并自动关联依赖项。在构造函数中添加了一个断点,结果它从未被调用过。所以我意识到我的定义必须比zuul的更早加载。所以我用@configuration annotation和@Order(Ordered.HIGHEST_PRECEDENCE)创建了一个配置类,并使用@Bean annotation在那里实例化我的类。不过,我的方法总是更早加载


共 (1) 个答案

  1. # 1 楼答案

    事实证明,Spring在加载配置类定义时遵循一定的顺序,这就是重写发生的地方。班级组织。springframework。上下文注释。ConfigurationClassParser在方法doProcessConfigurationClass()中有详细的逻辑。我将把我的简化摘要或排序规则放在这里:

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

    这解释了为什么我的超控无效。这是因为我一直在尝试的都是第二步。但是zuul通过@Import定义了bean,这是第3步

    所以为了解决我的问题,我在应用程序类中添加了一个@Bean注释方法,并按照预期进行实例化和重写

    上面的总结可能并不准确,它只是让您了解哪些内容可能会使您的覆盖失败。在尝试特定用例时,最好调试ConfigurationClassParser