山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

【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 関連記事へのリンク集つくりました。


Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発