2016-05-11 4 views
0

Wir verwenden den Component-Scan von Spring und wollen nicht, dass der Anwendungskontext Test-Beans lädt (selbst wenn sie in demselben Pfad definiert sind, d. H. A.b.c).Komponentenscan zum Vermeiden des Scannens des tst-Ordners

MyPackage 
    src 
     a.b.c.SRC 
    tst 
     a.b.c.TST 

Ich habe gelesen, dass Ordnung und dann den Testordner src Ordner zu laden wäre. Im obigen Fall, wenn ich a.b.c component-scanne, möchte ich nur Beans von SRC laden. Wie ist das möglich?

+0

ignoriert Warum 'nicht '? –

+0

Da es in a.b.c mehrere Konfigurationsklassen gibt, müssen diese explizit importiert werden. – instanceOfObject

+0

Wahrscheinlich wäre die beste Option, keine Test-only Spring-Komponenten zu haben. – kryger

Antwort

0

Sie können die Annotation @Profile ("ProfileName") für Ihre Komponenten verwenden und natürlich das aktive Profil bei der Ausführung festlegen. Der Komponentenscan ignoriert Beans, die nicht mit dem aktiven Profil übereinstimmen. z.B.

@Component 
@Profile("production") 
public class productionImpl implements SomeInterface{} 

@Component 
@Profile("test") 
public class testImpl implements SomeInterface{} 

Alles, was Sie danach tun müssen, ist das richtige Profil in der Live-Ausführung einzustellen. Sie können es entweder als JVM-Argument gesetzt (spring.profiles.active) oder an den application gesetzt: ApplicationContext.getEnvironment().setActiveProfiles(“ProfileName”);

Für Ihre Testausführungsklassen können Sie @ActiveProfiles verwenden („TestProfileName“)

Sie können prüfen, Diese Site für ein detaillierteres Beispiel: http://websystique.com/spring/spring-profile-example/

0

Es gibt mehrere Ausschlussfilter für den Classpath-Scan, den Sie in Ihrer Kontextkonfigurationsdatei definieren können. aspectj Filtertyp scheint der zu sein, den Sie verwenden möchten.

<context:component-scan base-package="a.b.c"> 
    <context:exclude-filter type="aspectj" expression="a.b.c.TST.*" /> 
</context:component-scan> 

Alternativ, wenn Sie ein bisschen mehr Granularität haben möchten, können Sie Ihre eigene Anmerkung definieren und verwenden Sie die annotation exclude-Filtertyp.

<context:component-scan base-package="com.example"> 
    <context:exclude-filter type="annotation" expression="path.to.your.package.ScanExclude"/> 
</context:component-scan> 

Auf diese Weise alle mit @ScanExclude Anmerkung kommentierten Klassen effektiv

Verwandte Themen