コンテキスト内の複数のパッケージ:component-scan、spring config


185

context:component-scan要素のspring-servlet.xmlファイルに複数のパッケージを追加するにはどうすればよいですか?

私が試してみました

<context:component-scan base-package="z.y.z.service" base-package="x.y.z.controller" />

そして

<context:component-scan base-package="x.y.z.service, x.y.z.controller" />

そして

<context:component-scan base-package="x.y.z.service" />
<context:component-scan base-package="x.y.z.controller" />

エラーが発生しました:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [x.y.z.dao.daoservice.LoginDAO] found for dependency:

回答:


272

次のアプローチは正しいです:

<context:component-scan base-package="x.y.z.service, x.y.z.controller" /> 

エラーx.y.z.dao.daoservice.LoginDAOは、上記のパッケージにはないについて不平を言うことに注意してください。おそらく、それを追加するのを忘れていました。

<context:component-scan base-package="x.y.z.service, x.y.z.controller, x.y.z.dao" /> 

5
この回答は、基本パッケージのメンバーには再帰がないことを意味しますが、次のとおりです: stackoverflow.com/questions/7774295/… 。これを明確にするために、答えを少し変更することをお勧めします。
djangofan 2015年

52

注釈アプローチ

@ComponentScan({ "x.y.z", "x.y.z.dao" })

特定のパッケージを強制的に追加する必要がありますか、それともトップレベルのパッケージのみを定義する場合はサブパッケージを自動的にスキャンできますか?
Nikhil Sahu

@NikhilSahuいいえ、再帰スキャンです(Spring 3>)
biology.info


43

複数の基本パッケージを追加できます(axtavtの回答を参照)が、基本パッケージ内でスキャンされるものをフィルターすることもできます。

<context:component-scan base-package="x.y.z">
   <context:include-filter type="regex" expression="(service|controller)\..*"/>
</context:component-scan>

2
@shamsは私を欺く必要はありませんが、答えが正しければ、受理済みとしてマークする必要があります(チェックマークをクリックします)
Sean Patrick Floyd

1
複数の基本パッケージを追加できないのはなぜですか?たとえば「org.example、com.example」のように?
Shervin Asgari 2014年


19
<context:component-scan base-package="x.y.z"/>

残りのパッケージは「xyz」のサブパッケージであるため、機能します。したがって、各パッケージを個別に言及する必要はありません。


2
OK!多分それは別の理由だったかもしれませんが、これは私にとって、ポートレット用のSpring MVCでは機能しませんでした...
elcadro

これは十分に文書化され、宣伝されている機能であるため、@ elcadroは他の理由によるものであったに違いない
eis

まあ、私は多くの人が私を修正しているので、私は反対を言うことはできません。これがうまくいかなかった理由を見つけられたらいいのに...とにかくありがとう!
elcadro 2013年

アノテーションベースの構成でも当てはまりますか?
Nikhil Sahu

6

別の一般的なアノテーションアプローチ:

@ComponentScan(basePackages = {"x.y.z"})

2

xyzが一般的なパッケージである場合は、以下を使用できます。

<context:component-scan base-package="x.y.z.*">

xyzcontroller、xyzserviceなど、xyzで始まるすべてのパッケージが含まれます。


1

たとえば、「com.abc」というパッケージがあり、その中に複数のパッケージがある場合、次のように使用できます。

@ComponentScan("com.abc")

0

応答が遅れますが、アノテーションベースのアプローチを使用して複数のパッケージを提供するには、次のように使用できます。

@ComponentScan({"com.my.package.one","com.my.package.subpackage.two","com.your.package.supersubpackage.two"})

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.