2016-08-09 30 views
0

Ich habe eine @Component -annotated Klasse, die mehrere automatisch verdrahtete Abhängigkeiten hat. Ich möchte dieses Paket nicht automatisch scannen, da es viele andere Klassen enthält, die ich nicht initialisieren möchte.Spring definiere Bean, um automatisch zu scannen

Ich kann diese zu einer @Configuration als @Bean hinzufügen, aber ich möchte nicht die Fähigkeit verlieren, Dinge automatisch verdrahtet zu haben, und ich nicht wirklich die Konfiguration an allen Stellen ändere sie sind konfiguriert. Mit anderen Worten, ich möchte nicht alle Abhängigkeiten für die oben genannte Komponente manuell auflisten.

Ich weiß, ich kann Filter für das Scannen von Komponenten verwenden, aber diese sind umständlich, wenn es viele Klassen in verschiedenen Paketen gibt, die auf die obige Weise ausgewählt werden.

Gibt es eine Möglichkeit, Spring mitzuteilen, dass eine bestimmte Klasse hinzugefügt und automatisch verdrahtet wird?

Antwort

1

Wie Sie aus der JavaDoc sehen können, hat die @ComponentScan Annotation verschiedene Möglichkeiten, wie Sie Komponenten registrieren können. Wenn Sie keine Filter verwenden möchten, ist es wahrscheinlich am einfachsten, wenn Sie selektiv Klassen und Unterpakete zum Scannen hinzufügen und nicht die oberste Ebene Ihrer Anwendung. Zum Beispiel:

@Configuration 
@ComponentScan(
    basePackages = { "me.myorg.myapp.services", "me.myorg.myapp.web" }, 
    basePackageClasses = { me.myorg.myapp.config.MyDbConfig.class }) 
public class MyAppConfig { ... } 

Es ist auch erwähnenswert, dass Sie eine Menge von öffentlichen statischen Konfigurationsunterklassen erstellen können. Diese werden beim Scannen von Komponenten ignoriert, können aber wie gewohnt in andere Konfigurationsklassen importiert werden. Dies kann in dem obigen Szenario nützlich sein, wenn Sie nur jedes Paket prüfen wollen, aber dann selektiv scannen oder importiert Subklassen:

public class BaseConfig { 

    @Configuration 
    public static class DbConfigA {...} 

    @Configuration 
    public static class DbConfigB {...} 

} 

@Configuration 
@ComponentScan(
    basePackages = { "me.myorg.myapp" }, 
    basePackageClasses = { DbConfigA.class }) 
public class MyAppConfig { ... } 
+0

Dank für die beiden Lösungen, ich denke, das für große arbeiten, was ich brauche. –