山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

【Spring Framework】component-scanのいろいろ③

今回は、[context:exclude-filter]タグについて記事にする。

前回、前々回のサンプルを使いまわすので、あらかじめ参照しておいて欲しい。

【Spring Framework】component-scanのいろいろ① - 山崎屋の技術メモ
【Spring Framework】component-scanのいろいろ② - 山崎屋の技術メモ

フォルダ構成だけ再掲する。
f:id:yyama1556:20160810173038p:plain

base-package配下のクラスをすべて登録

復習になるが、いったんbase-package配下で@Componentなどのアノテーションが付与されたクラスをすべて登録するよう、applicationContext.xmlを元に戻す。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd">
	<context:component-scan base-package="org.yyama.hoge"
		use-default-filters="true">
	</context:component-scan>
</beans>

[context:component-scan]タグの[use-default-filters]属性はデフォルトで"true"なので、記述しなくても構わない。

実行すると以下の出力を得られる。

fuga
piyo

exclude-filterを使用する

exclude-filterを使用してPiyoクラスを除外する方法。

applicationContext.xmlを以下のように修正する。(修正箇所だけ抜粋)

	<context:component-scan base-package="org.yyama.hoge"
		use-default-filters="true">
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Service" />
	</context:component-scan>

まずは、アノテーションで指定する方法。

[context:exclude-filter]のtypeに"annotation"を指定し、expressionに除外したいアノテーションを記載する。

実行結果。

fuga

期待通り@Serviceアノテーションが付与されているPiyoクラスはコンテナに登録されていない。


次に除外するクラスを正規表現で指定する例。[context:exclude-filter]のtypeに"regex"を指定する。

	<context:component-scan base-package="org.yyama.hoge"
		use-default-filters="true">
		<context:exclude-filter type="regex"
			expression="org.yyama.hoge.P.*" />
	</context:component-scan>

実行結果。

fuga

include-filter vs exclude-filter

最後にinclude-filterとexclude-filterで指定されたクラスが被った場合、どちらが強いのか実験しておく。

	<context:component-scan base-package="org.yyama.hoge"
		use-default-filters="false">
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Component" />
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Component" />
	</context:component-scan>

まったく被った場合の結果。

exclude-filterの勝ち。

ちなみに、include-filterは必ずexclude-filterの前に記載しなければいけないので、「順番を入れ替えたらどうなるか?」は心配しなくても良い。

次に、include-filterでアノテーション指定、exclude-filterで正規表現指定。

	<context:component-scan base-package="org.yyama.hoge"
		use-default-filters="false">
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Component" />
		<context:exclude-filter type="regex"
			expression="org\.yyama\..*" />
	</context:component-scan>

結果。

exclude-filterの勝ち。どのような記載にしても、指定したクラスが被った場合は、exclude-filterが勝つ。

それではここまで。


Spring 関連記事へのリンク集つくりました。