Component-scan mit einer Namenskonvention in Spring

Um Komponenten in einem Spring-Container bekannt zu machen, gibt es zwei grundsätzlich unterschiedliche Möglichkeiten:

  1. Explizite Bekanntmachung der Komponente z.B. per -Tag
  2. Automatische Suche nach Komponenten im Klassenpfad mit dem Tag

Die automatische Suche macht dabei standardmäßig alle Klassen im Klassenpfad zu einer Komponente, die mit einer der folgenden Annontation versehen wurden: @Component, @Service, @Repository und @Controller.

Falls stattdessen alle Klassen im Klassenpfad anhand einer bestimmten Namenskonvention zu einer Komponente werden sollen, kann dies per XML-Konfiguration wie folgt festgelegt werden:


  

Dabei werden in diesem Beispiel automatisch alle Klassen, deren Name auf “Service” enden, zu einer Komponente im Spring-Container. Dies ist vor allem für erfahrenere Spring-Entwicklung eine gute Alternative zur Verwendung der oben genannten Annotationen, da sich dadurch unnötige Tipparbeit sparen lässt und gleichzeitig Namenskonventionen für Komponenten ohne weitere Sicherungsmaßnahmen durchgesetzt werden können.

Seit der Version 3.1 von Spring ist es nun auch möglich einen solchen Komponentenscan mit einer Namenskonvention mit der neuen Spring Java Config im Quellcode anstatt per XML zu konfigurieren:

@Configuration
@ComponentScan(basePackages = { "de.oio.example" }, includeFilters = {
  @ComponentScan.Filter(type = FilterType.CUSTOM, value = { ServiceClassnameFilter.class })})
public class Config {
}

Die Annotation @ComponentScan an einer Configuration-Klasse schaltet den Komponentenscan ein. Per Parameter kann festgelegt werden wie die Komponenten gefunden werden sollen. In diesem Fall wird ein Custom-Filter hinzugefügt, der die entsprechende Filterung anhand der Klassennamen durchführt. Dieser Filter (ServiceClassnameFilter) ist eine Erweiterung des RegexPatternTypeFilter und sieht im konkreten Fall wie folgt aus:

class ServiceClassnameFilter extends RegexPatternTypeFilter {
    public ServiceClassnameFilter() {
        super(Pattern.compile(".*Service"));
    }
}
Short URL for this post: http://wp.me/p4nxik-S7
This entry was posted in Spring Universe and tagged , , , , , . Bookmark the permalink.

Leave a Reply