今回は、[context:exclude-filter]タグについて記事にする。
前回、前々回のサンプルを使いまわすので、あらかじめ参照しておいて欲しい。
【Spring Framework】component-scanのいろいろ① - 山崎屋の技術メモ
【Spring Framework】component-scanのいろいろ② - 山崎屋の技術メモ
フォルダ構成だけ再掲する。
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徹底入門 Spring FrameworkによるJavaアプリケーション開発
- 作者:株式会社NTTデータ
- 出版社/メーカー: 翔泳社
- 発売日: 2016/07/21
- メディア: 大型本