0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Spring DI関連アノテーションについて

Last updated at Posted at 2020-02-28

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をリターン
 

Example
   @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メソッド
Maven設定
<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メソッド、コンストラクト、一般メソッド
Maven設定
<dependency>
     <groupId>javax.inject</groupId>
     <artifactId>javax.inject</artifactId>
     <version>1</version>
</dependency>

@Required

Setterメソッドの上に記述し、必須プロパティーを設定する用途で使われる。使うためには、RequiredannotationBeanPostProcessorクラスをBeanとして登録するか、設定を追加すればいける。

Example
   package day1;
   public class Emp {
   private String ename;
   @Requried
   public void setEname( String ename ) { this.ename = ename; }
   public String getName() { return this.ename; }
   }
Beans.xml
<bean id="emp" class="day1.Emp" >
  <!-- 以下のプロパティーを設定しないとエラー -->
  <!-- <property ename="ename" value="hoge" /> -->
</bean>
main()
   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 については明日・・・

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?