Spring boot ComponentScan excludeFIlters nicht ohne
Ich bin eine SimpleTest :
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SimpleTestConfig.class)
public class SimpleTest {
@Test
public void test() {
assertThat(true);
}
}
und ein Konfiguration für diesen test :
@SpringBootApplication
@ComponentScan(basePackageClasses = {
SimpleTestConfig.class,
Application.class
},
excludeFilters = @ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = Starter.class))
public class SimpleTestConfig {
}
Ich versuche ausgeschlossen werden, die Starter Klasse
package application.starters;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class Starter {
@PostConstruct
public void init(){
System.out.println("initializing");
}
}
Und die Anwendung - Klasse sieht wie folgt aus :
package application;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import static org.springframework.boot.SpringApplication.run;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
run(Application.class, args);
}
}
Aber für einen sehr komischen Grund die Starter Klasse ist noch immer initialisiert.
Kann mir jemand erklären, warum die ComponentScan excludeFilters
ist nicht ohne meine Starter
Klasse ?
- Entweder mir fehlt die main (Methode) in SimpleTestConfig, oder Sie nicht gut erklärt, wo wollen Sie ausschließen aus
- Ersetzen
@SpringBootApplication
mit@Configuration
auf SieSimpleTestConfig
Klasse. Und hoffe auch, dass es in Ihrem src/main Ordner, wenn Sie erstellen ein test-Zweck-Konfiguration(in src/test Ordner), verwenden Sie@TestConfiguration
annotation statt. - Ähnliche Frage: stackoverflow.com/questions/25550494/...
- Rwlated: stackoverflow.com/questions/18992880/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jede Komponente scan-Filterung individuell. Während Sie ausschließen
Starter.class
ausSimpleTestConfig
,SimpleTestConfig
initialisiertApplication
, die nicht seine eigene@ComponentScan
ohneStarter
.Die saubere Art und Weise der Verwendung ComponentScan ist für jeden ComponentScan Scannen separate Pakete, so wird jeder filter funktioniert einwandfrei. Wenn 2 separate ComponentScans scan mit dem gleichen Paket (wie in tests), funktioniert dies nicht.
Einen trick, dies ist ein Modell
Starter
bean:Spring verwendet, die mock anstelle der realen Klasse, also die
@PostConstruct
Methode nicht aufgerufen werden.Andere gängige Lösungen:
Application.class
in jeder unit-test@Profile("!TEST")
auf dieStarter
Klasse@ConditionalOn...
annotation auf derStarter
Klasse@SpringBootApplication, nach Frühling-Dokumentation stellt die kombinierte Funktionalität von:
@- Konfiguration, @EnableAutoConfiguration und @ComponentScan in einer notation.
Versuchen zunächst ohne die Verfeinerung Ihrer Paket-scan (ohne die basePackages filter).
Können Sie festlegen, benutzerdefinierte Komponente scan-filter für das ausschließen es.
Beispiel-code werden wie:
Dies funktioniert für mich.
Für weitere Informationen gehen Sie zu dieser blog.