2016-08-07 41 views
1

Mit Spring 3 mit Federdaten habe ich ein Paket com.company.repository mit allen Klassen im Zusammenhang mit Federdaten Repository (ca. 50 Klassen).Unit-Tests sehr langsam, weil Spring Classpath scannt mehrere Male das gleiche Paket scannt

Die Komponente Scan als deklariert:

<context:component-scan base-package="com.company"/> 

In meinen Unit-Tests, der Schritt Federkomponenten zu scannen ist sehr lang (ca. 10 Sekunden). Nachdem das Ablaufverfolgungsprotokoll aktiviert wurde, habe ich festgestellt, dass das Paket "com.company.repository" mehrmals gescannt wird. Tatsächlich wird die Methode ClassPathScanningCandidateComponentProvider.findCandidateComponents ("com.company.repository") mehrmals mit demselben Wert aufgerufen. Ich verstehe nicht, warum ich dieses Verhalten habe. Und ich überschreibe es nicht durch eine benutzerdefinierte Implementierung (oder ich finde nicht, wie das geht). Und ich verstehe nicht, warum das ist kein Cache in der Standardimplementierung?

Jemand hat eine Idee, warum ich dieses Verhalten habe? Es ist normal ?

In Ergänzung ist das folgende der Stapel auf meinen Fall bezogen werden:

ClassPathScanningCandidateComponentProvider.findCandidateComponents(String) line: 224 
RepositoryBeanDefinitionBuilder.detectCustomImplementation(BeanDefinitionRegistry, ResourceLoader) line: 154  
RepositoryBeanDefinitionBuilder.registerCustomImplementation(BeanDefinitionRegistry, ResourceLoader) line: 116 
RepositoryBeanDefinitionBuilder.build(BeanDefinitionRegistry, ResourceLoader) line: 97 
RepositoryBeanDefinitionParser.registerGenericRepositoryFactoryBean(RepositoryConfiguration<XmlRepositoryConfigurationSource>, ParserContext) line: 101 
RepositoryBeanDefinitionParser.parse(Element, ParserContext) line: 71 
JpaRepositoryNameSpaceHandler(NamespaceHandlerSupport).parse(Element, ParserContext) line: 73 
BeanDefinitionParserDelegate.parseCustomElement(Element, BeanDefinition) line: 1419 
BeanDefinitionParserDelegate.parseCustomElement(Element) line: 1409 
DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(Element, BeanDefinitionParserDelegate) line: 184 
... 
XmlBeanDefinitionReader.doLoadBeanDefinitions(InputSource, Resource) line: 390 
+1

Ich würde es nicht einen Komponententest nennen, wenn Sie sich auf Spring verlassen, um Ihre Bohnen zu erstellen. Das klingt eher nach Integrationstests. –

Antwort

0

Vielleicht sind Ihre Tests konfigurieren zu erstellen und Ihre Feder Kontext nach jedem Test zu zerstören. Überprüfen Sie Ihre Testbasiskonfiguration.

+0

Dies ist nur für 1 Test der Fall. – Jonathan

+0

Nach einigen Untersuchungen bemerkte ich, dass die Startzeit sehr lang ist, um die gesamten Repository-Klassen zu registrieren. Daher wollte ich mit einem benutzerdefinierten Filter einige Repository-Klassen ausschließen, die ich für meinen Test nicht benötige. Aber die Bean "RepositoryBeanDefinitionBuilder" berücksichtigt meinen Filter nicht. Ich habe festgestellt, dass es zwei verschiedene Scanner beim Start von Spring gibt: ClassPathScanningCandidateComponentProvider => Mein Filter wird berücksichtigt RepositoryComponentProvider => Mein Filter wird nicht berücksichtigt. Wie kann ich Klassen vom zweiten Provider (RepositoryComponentProvider) ausschließen? – Jonathan

+0

können Sie versuchen, Ihr Repository-Paket aus dem Komponenten-Scan zu entfernen? und geben Sie diesen Pfad in der Option "Scan-Repositories" an. – duardito