2016-11-15 785 views
0

我使用自动配置其自己的RabbitMQ客户端的公司Spring Boot扩展。这个扩展(起动器)取代了Spring Boot RabbitAutoConfiguration。SpringBoot在启动时定义的多个自动配置排除项

我知道有很多方法来禁用RabbitAutoConfiguration:

  • 与@EnableAutoConfiguration每个应用(主)类(不包括= RabbitAutoConfiguration.class)或@SpringBootApplication(排除= RabbitAutoConfiguration.class)
  • 在application.properties或YML文件(外在或罐子内),与spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration

我不知道是否有一种方式,我的新起动器存在禁用Spring Boot RabbitAutoConfiguration。

我尝试了一些肮脏的东西,例如在公司启动模块中放置一个application.properties与exclude属性,但由于Spring Boot只在类路径中读取一个,所以它可以很容易地被客户端应用程序中的一个覆盖。我不想强加一些限制。

我不喜欢每个应用程序添加相同的排除方式(属性或注释)的想法。

任何想法?

编辑

我需要在同一应用中配置多个RabbitMQ的ConnectionFactoryRestTemplate

+1

如果您手动配置兔子,自动配置将自动退出...无需排除它。 –

+0

@ M.Deinum这不是我得到的行为,因为配置中有两个RabbitTemplate。 RabbitAutoConfiguration不适用于多个。 –

+0

配置上有很多'@CnditionalOnMissingBean'注释。所以如果你已经添加了一个'RabbitTemplate'和'Connection',配置不应该做任何事情。 –

回答

2

如果您想要真正替代标准RabbitAutoConfiguration,您只需在自己的自动配置上添加@AutoconfigureBefore(RabbitAutoConfiguration.class),以教授Spring Boot在标准之前处理您的标准。

如果它是替代品,您将注册标准自动配置将检测到的bean,并且它将以与您手动定义它们相同的方式注销。

话虽如此,你为什么这样做呢?我宁愿补充现有的自动配置,而不是取代标准的。标准配置有问题吗?如果是这样,我们很乐意听到它,并修改代码,以便您不必完全替代它。

+0

不管条件如何,配置仍然需要一个'ConnectionFactory',因为你显然有多个失败。您可以将其中一个标记为'@ Primary'来解决该问题。 –

+0

@M。Deinum:你是对的 - 当有可能注释一个'ConnectionFactory'_的@Bean声明时。问题在于连接工厂在启动时由自制的BeanDefinitionRegistryPostProcessor(BDRPP)进行动态注册:在Spring Config中为应用程序所需的每个RestTemplate声明了一个BDRPP实例。注册bean时,不能动态定义'@ Primary'注释。然而,解决这个问题的最简单方法是在我自己的自动配置器中完全禁用“RabbitAutoConfiguration”的明确指令。 –

+0

您可以告诉BeanDefinition它是否是主要的......因此,您可以将第一个标记为主要标记。 –