2016-11-15 7 views
0

Ich arbeite an einer unternehmenseigenen Spring Boot-Erweiterung, die eigene RabbitMQ-Clients automatisch konfiguriert. Diese Erweiterung (ein Starter) ersetzt die Spring Boot RabbitAutoConfiguration.SpringBoot Mehrere AutoConfiguration-Ausschlüsse beim Start definiert

Ich weiß, es gibt viele Möglichkeiten, um die RabbitAutoConfiguration zu deaktivieren:

  • in jeder Applikation (Haupt-) Klasse mit @EnableAutoConfiguration (exclude = RabbitAutoConfiguration.class) oder @SpringBootApplication (exclude = RabbitAutoConfiguration.class)
  • in der application.properties oder yml Datei (externalisierten oder innerhalb des jAR), mit spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration

Ich frage mich, ob es eine Möglichkeit gibt, dass die Präsenz meines neuen Starters die Spring Boot RabbitAutoConfiguration deaktiviert.

Ich habe einige schmutzige Dinge versucht, wie zum Beispiel eine application.properties mit der Eigenschaft exclude im Corporate-Starter-Modul, aber da Spring Boot nur einen im classpath liest, kann es leicht von einem in einer Client-Anwendung überschrieben werden . Ich möchte keine Einschränkungen auferlegen.

Ich mag nicht die Idee von jeder Anwendung, die den gleichen Ausschluss auf die eine oder andere Weise (Eigenschaften oder Annotation) hinzufügen.

Irgendwelche Ideen?

EDIT

ich mehrere RabbitMQ ConnectionFactory und RestTemplate innerhalb derselben Anwendung zu konfigurieren.

+1

Wenn Sie Hase manuell konfigurieren, wird die automatische Konfiguration automatisch zurückgesetzt ... Sie müssen nicht ausgeschlossen werden. –

+0

@M.Deinum Dies ist nicht das Verhalten, das ich bekomme, weil es zwei RabbitTemplate in der Konfiguration gibt. Die RabbitAutoConfiguration funktioniert nicht mit mehreren. –

+0

Es gibt eine Menge '@ConditionalOnMissingBean' Annotation in der Konfiguration. Wenn Sie also bereits 'RabbitTemplate' und' Connection' hinzugefügt haben, sollte die Konfiguration nichts bewirken. –

Antwort

2

Wenn Sie wollen wirklich den Standard RabbitAutoConfiguration von Ihnen zu ersetzen, müssen Sie nur @AutoconfigureBefore(RabbitAutoConfiguration.class) auf Ihrem eigenen Auto-Konfiguration hinzuzufügen Frühling Stiefel zu lehren Ihren, bevor der Standard zu verarbeiten.

Wenn es sich um einen Ersatz handelt, registriert Ihr System Beans, die von der Standard-Autokonfiguration erkannt werden, und es wird auf die gleiche Weise zurückgesetzt, als ob Sie sie manuell definiert hätten.

Nachdem wir das gesagt haben, warum machst du das? Ich würde lieber ergänzen die vorhandene Autokonfiguration, anstatt den Standard zu ersetzen. Gibt es ein Problem mit dem Standard? Wenn ja, würden wir gerne davon hören und den Code so anpassen, dass Sie ihn nicht vollständig ersetzen müssen.

+0

Nun, die Konfiguration, trotz der Bedingungen, erfordert immer noch eine einzelne 'ConnectionFactory', da Sie scheinbar mehrere haben, die fehlschlägt. Sie können einen von ihnen als '@ Primary' markieren, um das Problem zu lösen. –

+0

@M.Deinum: Du hast recht _wenn es möglich ist, die @Bean-Deklaration einer 'ConnectionFactory'_ zu kommentieren. Das Problem besteht darin, dass Verbindungsfactories _dynamisch_ von einem selbst erstellten 'BeanDefinitionRegistryPostProcessor' (BDRPP) beim Start registriert werden: Eine Instanz dieses BDRPP wird in der Spring Config für jedes von der Anwendung benötigte RestTemplate deklariert. Die Annotation "@ Primary" kann beim Registrieren einer Bean nicht dynamisch definiert werden. Der einfachste Weg, dies zu lösen, wäre jedoch eine explizite Anweisung in meinem eigenen Autokonfigurator, die die 'RabbitAutoConfiguration' komplett deaktiviert. –

+0

Sie können eine' BeanDefinition' bestimmen, wenn es die primäre ... ist. Sie könnten also die erste als primary markieren. –