山崎屋の技術メモ

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

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

前回の続き。サンプルコードは前回のものをベースに少し変更する。

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

applicationContext.xml内の[context:component-scan]タグを以下のようにすることで、FugaクラスもPiyoクラスもSpringコンテナに登録されないことを確認した。

<context:component-scan base-package="org.yyama.hoge"
		use-default-filters="false" />

この状態から[context:include]タグを使って、一部のクラスだけを登録するようにしたい。

アノテーションを指定して登録する

Fugaクラスには@Componentアノテーションが付与されている。Piyoクラスには@Serviceアノテーションが付与されている。

では、ベースパッケージ配下の@Serviceアノテーションが付与されたクラスだけをロードするように変更したい。

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="false">
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Service" />
	</context:component-scan>
</beans>

[context:include-filter]タグのtypeに"annotation"を指定することにより、expressionで指定したアノテーションが付与されているクラスだけをコンテナに登録するよう指示している。

実行すると期待通りPiyoクラスだけ登録されていることが確認できる。

piyo

じゃあ、include-filterを次のようにすると、Fugaクラスだけ登録されるのだろうか。

		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Component" />

残念ながら、@Serviceアノテーションは@Componentアノテーションを含んでいるので、FugaクラスだけでなくPiyoクラスも登録される。詳しくは、本家のJavadocを確認しよう。

登録するクラスを正規表現で指定する。

正規表現で登録するクラスを指定することもできる。その場合、[context:include-filter]タグのtypeに"regex"を指定し、expressionに正規表現を指定する。

		<context:include-filter type="regex"
			expression="org\.yyama\.hoge\.F.*" />

実行結果。

fuga

正規表現を指定する場合、Furaクラスの@Componentアノテーションは、記述しなくても構わない。

その他のtype

[context:include-filter]タグのtypeには、そのほかにも、assignable/aspectj/customが指定できる。詳しくはリファレンスマニュアルを参照して欲しい。

今日はここまで。

続きは
【Spring Framework】component-scanのいろいろ③ - 山崎屋の技術メモ


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