Spring(17)——JSR 330標準へのサポート


もっと読む
17 JSR 330標準注釈に対するサポート
Spring標準の注釈を使用してbeanを定義し、bean間の依存関係を定義する以外に、SpringはJSR 330標準の注釈を使用して関連定義を行うことをサポートしています.主に@Injectと@Namedの2つの注釈をサポートしています.
JSR 330標準の注釈を使って対応するbean定義を行うには、まずJSR 330標準対応のjarパケットを私たちのクラスパスパスパスパスに加える必要があります.筆者はMavenを使って対応する依存関係を管理する習慣があるので、筆者はプロジェクトのpom.xmlファイルに次のような依存項を加えるだけでいいです.
<dependency>
	<groupId>javax.injectgroupId>
	<artifactId>javax.injectartifactId>
	<version>1version>
dependency>
17.1@Inject
@Injectコメントの機能はSpring標準の@Autowired注釈の機能に相当します.自動注入を定義するためのもので、@Autowiredと同じように、@Injectはfield、methodまたはconstructに表示されます.
1、fieldに表示する
public class Hello {
	
	@Inject
	private World world;
	
}
2、methodに表示する
public class Hello {
	
	private World world;
	
	@Inject
	public void doSomething(World world) {
		this.world = world;
	}

}
方法注入の場合も1つの方法で複数のbeanを同時に注入することができ、特に以下に示す.
public class Hello {
	
	private World world;
	private BeanA beanA;
	
	@Inject
	public void doSomething(World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}

}
3、constructorに表示する
public class Hello {
	
	private World world;
	private BeanA beanA;
	
	@Inject
	public Hello(World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}

}
@Injectは、自動注入を行う際に、デフォルトではfieldの名称、methodパラメータの名称によって対応するbeanを探して注入します.もちろん、このメカニズムは@Namedまたは@Qualfierによっても変更できます.上記の例で@Injectがfieldに表記されている場合、対応するfieldの名称が「world」であることを確認しました.私達のbean容器に次の二つのbeanがある場合、beanNameをworldのそのbeanにデフォルト注入します.
<bean id="world" class="com.elim.learn.spring.bean.World" p:id="1"/>
<bean id="world2" class="com.elim.learn.spring.bean.World" p:id="2"/>
同様の機構は方法注入と構造法注入にも適用される.この点から言えば、@Injectは@Autowiredよりも使いやすいと思います.対応する名前のbeanが容器に存在しない場合は、タイプによって注入し、対応するタイプが存在しない場合はSpringが例外となります.@Injectは@Autowiredのようにrequiredの属性を指定することができます.だから、あるfieldやmethodなどを配置したら、bean容器には必ず対応するタイプのbeanが必要です.Springは異常を投げます.また、@Injectに表示されているfield対応名称やmethod対応パラメータ名のbeanが容器に存在しない場合、Springはタイプによって注入されますが、このときbean容器に同じタイプの複数のbeanが存在するとSpringも例外を投げます.この時は@Namedを通じて具体的にどのbeanを注入するべきかを指定できます.もちろん@Autowiredサポートの@Qualfierを使ってもいいです.
17.2@Named
@Namedの機能はSpring標準注中の@Qualfierに相当します.@Qualfierと同様に、@Named注解は任意の@Injectまたは@Autowiredに出現するところにもfield、方法パラメータなどを表示することができます.また@Namedをクラスに表示することもでき、@Namedをクラスに表示する場合、その機能はクラスに@Componentを使用して表示することに相当し、そのvalue属性によりSpringスキャンを指定してbean定義を追加することもできます.@Qualfierをクラスに表示する場合は、beanに対応するqualiferだけを定義します.
public class Hello {
	
	@Inject
	@Named("world1")
	private World world;

}
上記の例は@Namedを使って、beanNameを「world 1」と注入したbeanを明確に表しています.注意したいのは@Namedを使って表示する時、beanNameに対応するbeanを探します.しかも必ずbeanNameです.この点は@Qualfierとは違います.@Quallifierはbeanのqualiferにも対応できます.上記のように@Named(「world 1」)は以下のような構成では通用しませんが、@Named(「world 1」)を@Qualfier(「world 1」)に置き換えれば大丈夫です.
<bean id="world" class="com.elim.learn.spring.bean.World" p:id="1">
	<qualifier value="world1"/>
bean>
メソッドによる注入の方法パラメータに@Namedを付した例です.
public class Hello {
	
	private World world;
	private BeanA beanA;
	
	@Inject
	public void doSomething(@Named("world2") World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}

}
@Namedを使ってクラスに表示する場合、その機能と使い方は@Componentと同じです.Springスキャンクラスの機能を有効にすると、Springはデフォルトでは@Namedと表示されているクラスをスキャンして、それをbeanとして対応するbean容器に定義します.次のように、@Namedを使ってクラスに表示する例です.
@Named
public class Hello {
	
	private World world;
	private BeanA beanA;
	
	@Inject
	public void doSomething(@Named("world2") World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}

}
クラスに@Namedで表示する場合、value属性で対応するbeanNameを指定しないと、デフォルトではクラス名を取って、最初の文字を小文字で表します.上記の例のように、デフォルトでは「ハロー」をbeanNameとして使用します.
(注:本文はSpring 4.1.0に基づいて書いています.)