2016-08-07 5 views
1

スプリングデータでスプリング3を使用すると、私はcom.company.repositoryにスプリングデータリポジトリに関連するすべてのクラス(約50クラス)を持ちます。ユニットクラスのテストは非常に遅いです。クラスパススキャンで同じパッケージを複数回スキャンします。

コンポーネントスキャンは以下のように宣言される:私のユニットテストで

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

、スプリング部品をスキャンするステップは、(約10秒)非常に長いです。 トレースログを有効にした後、パッケージ「com.company.repository」が複数回スキャンされていることに気付きました。 実際、ClassPathScanningCandidateComponentProvider.findCandidateComponents( "com.company.repository")メソッドは同じ値で何度も呼び出されます。 なぜこの動作があるのか​​わかりません。 そして私はそれをカスタム実装でオーバーライドしません(またはそれを行う方法がわかりません)。 そして、なぜデフォルトの実装でキャッシュがないのか分かりません。

誰かがこの動作をなぜ持っているのでしょうか?それは普通ですか?補数で

、次は私の場合に関連するスタックです:

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

あなたがBeanを作成するためにSpringに頼っているのであれば、私は単体テストと呼んでいません。それは統合テストのように聞こえる。 –

答えて

0

はたぶんあなたのテストは、各テストの後に、あなたの春のコンテキストを作成し、破棄するように設定されています。 テストの基本設定を確認してください。

+0

これは、1回のテストでも同様です。 – Jonathan

+0

調査したところ、リポジトリクラス全体を登録するには起動時間が非常に長いことに気付きました。だから私は私のテストのために必要ではないいくつかのリポジトリクラスをカスタムフィルタで除外したかったのです。しかし、 "RepositoryBeanDefinitionBuilder" Beanは自分のフィルタを考慮していません。 春の起動時に2つの異なるスキャナがあることに気付きました:ClassPathScanningCandidateComponentProvider =>私のフィルタは考慮されていますRepositoryComponentProvider =>私のフィルタは考慮されません。 2番目のプロバイダ(RepositoryComponentProvider)からクラスを除外する方法は? – Jonathan

+0

コンポーネントからリポジトリパッケージを削除しようとしますか?スキャン・リポジトリー・オプションでこのパスを指定します。 – duardito

関連する問題