Ist es möglich, alle Klassen innerhalb eines Pakets als Spring-Beans zu registrieren?

7

Ich kenne die Java-basierten Konfigurationsoptionen von Springs, einschließlich der Verwendung von @Component und @Configuration in Verbindung mit @Bean -Anmerkungen zur Registrierung von Spring-Beans.

Wenn Sie jedoch ein Projekt mit anständiger Größe in Spring umwandeln, kann es sehr arbeitsintensiv sein, systematisch alle Klassen im Projekt zu bearbeiten und mit @Configuration @Bean s zu aktualisieren oder jede Klasse mit @Component zu kommentieren. Wir haben ein großes Groovy-Projekt, das konvertiert werden soll, und ich möchte den Prozess vereinfachen.

Meine Frage: Gibt es im Frühjahr eine Funktion, die es Spring ermöglicht, alle gültigen Bean-Kandidatenklassen innerhalb eines bestimmten Pakets automatisch zu konfigurieren?

Wenn nicht, welche anderen Optionen sind verfügbar?

    
pczeus 31.05.2016, 14:22
quelle

4 Antworten

7

ClassPathBeanDefinitionScanner ist alles was Sie brauchen.

%Vor%

Sie können benutzerdefinierte Logik im Include-Filter übergeben, wenn Sie möchten. In der aktuellen Version wird jede Klasse im bereitgestellten Paket als Bean enthalten sein.

Aber es ist unmöglich, automatisch eine richtige Abhängigkeitsstruktur für Ihre Klassen zu erstellen, es hängt wirklich vom gewünschten Umfang ab. Sie müssen es mit Ihren Händen tun.

    
SerCe 04.06.2016 14:01
quelle
6

Ich würde fast dasselbe tun wie Roman, nur würde ich es zur Build-Zeit, nicht zur Laufzeit, mit Code-Generierung machen. Der Grund dafür ist, dass ich magischerweise mag, dass die Magie zur Erstellungszeit passiert, bis zur Magie, die während der Bereitstellungszeit passiert.

Schreiben Sie in der einfachsten Version eine Hauptmethode, die das Paket scannt (anstelle von Reflexionen api verwende ich Guava ) s ClassPath-Scanner) und erstellt für jede gefundene Klasse eine @Bean -Methode.

Für die Code-Generierung würde ich JCodeModel verwenden:

%Vor%     
Sean Patrick Floyd 03.06.2016 11:57
quelle
4

Sie können versuchen, Ihre eigene zu verwenden BeanDefinitionRegistryPostProcessor

%Vor%

Siehe Beispielprojekt in Ссылка

    
Roman Sandarkin 31.05.2016 16:55
quelle
1

Auf die Gefahr hin, primitiv zu klingen, warum nicht einfach eine einfache Suche durchführen und in Ihrer IDE ersetzen (z. B. nach "public class" in einem Paket suchen und durch "@Component public class" ersetzen)? Das sollte viel schneller sein als der Versuch, irgendetwas programmatisch zu machen.

    
PaulNUK 08.06.2016 07:51
quelle