Ich habe eine Komponente, die ich @ComponentScan
in einer bestimmten von einer ausschließen möchte @Configuration
:
@Component("foo") class Foo {
...
}
Ansonsten scheint es mit einer anderen Klasse in meinem Projekt zusammenzustoßen. Ich verstehe die Kollision nicht vollständig, aber wenn ich die @Component
Anmerkung auskommentiere, funktionieren die Dinge so, wie ich es möchte. Andere Projekte, die auf dieser Bibliothek basieren, erwarten jedoch, dass diese Klasse von Spring verwaltet wird. Daher möchte ich sie nur in meinem Projekt überspringen.
Ich habe versucht @ComponentScan.Filter
:
@Configuration
@EnableSpringConfigured
@ComponentScan(basePackages = {"com.example"}, excludeFilters={
@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class)})
public class MySpringConfiguration {}
aber es scheint nicht zu funktionieren. Wenn ich es versuche FilterType.ASSIGNABLE_TYPE
, erhalte ich einen seltsamen Fehler, weil ich eine scheinbar zufällige Klasse nicht laden kann:
Auslöser: java.io.FileNotFoundException: Die Klassenpfadressource [junit / framework / TestCase.class] kann nicht geöffnet werden, da sie nicht vorhanden ist
Ich habe auch versucht, type=FilterType.CUSTOM
Folgendes zu verwenden:
class ExcludeFooFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader,
MetadataReaderFactory metadataReaderFactory) throws IOException {
return metadataReader.getClass() == Foo.class;
}
}
@Configuration @EnableSpringConfigured
@ComponentScan(basePackages = {"com.example"}, excludeFilters={
@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class)})
public class MySpringConfiguration {}
Aber das scheint die Komponente nicht wie gewünscht vom Scan auszuschließen.
Wie schließe ich es aus?
quelle
Antworten:
Die Konfiguration scheint in Ordnung zu sein, außer dass Sie
excludeFilters
anstelle vonexcludes
:quelle
Die Verwendung expliziter Typen in Scanfiltern ist für mich hässlich. Ich glaube, ein eleganterer Ansatz besteht darin, eine eigene Markierungsanmerkung zu erstellen:
Markieren Sie die Komponente, die damit ausgeschlossen werden soll:
Und schließen Sie diese Anmerkung von Ihrem Komponentenscan aus:
quelle
@Component
, aber ich glaube nicht, dass das die Frage istEin anderer Ansatz besteht darin, neue bedingte Anmerkungen zu verwenden. Seit dem einfachen Spring 4 können Sie @Conditional Annotation verwenden:
und definiere bedingte Logik zum Registrieren der Foo-Komponente:
Die bedingte Logik kann auf dem Kontext basieren, da Sie Zugriff auf die Bean Factory haben. Zum Beispiel, wenn die Komponente "Bar" nicht als Bean registriert ist:
Mit Spring Boot (sollte für JEDES neue Spring-Projekt verwendet werden) können Sie diese bedingten Anmerkungen verwenden:
@ConditionalOnBean
@ConditionalOnClass
@ConditionalOnExpression
@ConditionalOnJava
@ConditionalOnMissingBean
@ConditionalOnMissingClass
@ConditionalOnNotWebApplication
@ConditionalOnProperty
@ConditionalOnResource
@ConditionalOnWebApplication
Auf diese Weise können Sie die Erstellung von Bedingungsklassen vermeiden. Weitere Informationen finden Sie in den Spring Boot-Dokumenten.
quelle
Falls Sie zwei oder mehr excludeFilters definieren müssen Sie Kriterien , müssen Sie das Array verwenden.
Für Instanzen in diesem Codeabschnitt möchte ich alle Klassen im Paket org.xxx.yyy und eine andere bestimmte Klasse, MyClassToExclude , ausschließen
quelle
Ich hatte ein Problem bei der Verwendung von @Configuration , @EnableAutoConfiguration und @ComponentScan beim Versuch, bestimmte Konfigurationsklassen auszuschließen. Die Sache ist, dass es nicht funktioniert hat!
Schließlich löste ich das Problem mit @SpringBootApplication , das laut Spring-Dokumentation dieselbe Funktionalität wie die drei oben genannten in einer Anmerkung bietet.
Ein weiterer Tipp ist, es zuerst zu versuchen, ohne den Paket-Scan zu verfeinern (ohne den basePackages-Filter).
quelle
Für den Fall, dass Testkomponenten oder Testkonfigurationen ausgeschlossen werden, wurden in Spring Boot 1.4 neue Testanmerkungen
@TestComponent
und eingeführt@TestConfiguration
.quelle
Ich musste eine Prüfung @Aspect @Component aus dem App-Kontext ausschließen, aber nur für einige Testklassen. Am Ende habe ich @Profile ("audit") für die Aspektklasse verwendet. Einschließen des Profils für den normalen Betrieb, aber Ausschließen (nicht in @ActiveProfiles einfügen) für die spezifischen Testklassen.
quelle