Spring DI関連アノテーションの種類
Context Configuration Annotations
@Scope
@Autowired
@Resource
@Inject
@Required
@Named
@Order
@PostConstruct
@PreDestroy
@Scope
一般的に @Component @Service @Repository などで自動的にスキャニングするBeanはシングルトンとして一つのみ生成されるが、これを変更するためには @Scope アノテーションを使えばよい。つまり、Beanの範囲を設定してあげる。
singleton -
IoC コンテナー
当たり一つのBeanをリターン
prototype -リクエスト
がある度に新しいBeanを作成し、リターン
request -HTTP request オブジェクト
当たり一つのBeanをリターン
session -HTTP session オブジェクト
当たり一つのBeanをリターン
globalSession -全てのセッション
に対する一つのBeanをリターン
@Component
@Scope("prototype")
Class Hoge { ... }
<bean id="hoge" class="aaa.java.bbb.ccc.hoge" scope="prototype" />
Beanを注入してもらった場合は、下記のアノテーションが使える。
@Autowired
Spring Frameworkに属するアノテーション
Beanのidかname、どっちか合ったら適用する。Type Driven Injection
いくつかのBeanが検索された場合は、@Qualifier(name="hoge")
アノテーションで区別する。
基本的に @Autowiredになった属性はすべてBeanが注入される。
- 適用できるとこ:メンバー変数、setterメソッド、コンストラクト、一般メソッド
@Resource
Spring 2.5 以上で使えて、Spring Frameworkに属しないアノテーション
Beanのnameで注入されるBeanを探す。使うためには、JSR.250ライブラリのjsr250-api.jar
をクラスパスに追加する。
- 適用できるとこ:メンバー変数、setterメソッド
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
@Inject
Spring 3.0 以上で使える。特定のFrameworkに属しないアプリーを構成するためには、@Injectを使うことがおすすめされている。使うためには、JSR.330ライブラリのjavax.inject-x.x.x.jar
をクラスパスに追加する。
- 適用できるとこ:メンバー変数、setterメソッド、コンストラクト、一般メソッド
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
@Required
Setterメソッドの上に記述し、必須プロパティーを設定する用途で使われる。使うためには、RequiredannotationBeanPostProcessorクラスをBeanとして登録するか、設定を追加すればいける。
package day1;
public class Emp {
private String ename;
@Requried
public void setEname( String ename ) { this.ename = ename; }
public String getName() { return this.ename; }
}
<bean id="emp" class="day1.Emp" >
<!-- 以下のプロパティーを設定しないとエラー -->
<!-- <property ename="ename" value="hoge" /> -->
</bean>
ApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");
Emp emp = (Student) ctx.getBean("emp");
System.out.println("Ename : " + emp.getEname());
実行すると、下記のエラーが出る。
>
```ruby:Error
Property 'ename' is required for bean 'emp'
少し疲れたので、@Named @Order @PostConstruct については明日・・・