Spring IoC注釈ベースの構成、パート2

前回の記事で、 Spring IoCの主要な注釈について説明しましたが、もっと興味深いことをお伝えしたいと思います。

Spring Frameworkが何であるかを知らない人のために、この記事を読むことをお勧めします







@Autowiredについてもう少し詳しく



@Autowiredアノテーションは、依存関係をBeanフィールドに注入するためだけでなく、セッター、コンストラクター、およびメソッドにもBeanフィールドに適用できます。 これらの各ケースで@Autowiredが意味することを考慮してください。



1.セッターに適用される@Autowired

注入する実験Beanを次のようにします。

package ru.mypackage;



import org.springframework.context.annotation.Scope;

import org.springframework.stereotype.Service;



@Service( "testBean" )

@Scope( "singleton" )

public class TestBean {

private String data = "I am a singleton!!" ;



public String getData() {

return data;

}



public void setData( String data) {

this .data = data;

}

}




* This source code was highlighted with Source Code Highlighter .






そして、 これを注入するBean:

package ru.mypackage;



import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Scope;

import org.springframework.stereotype.Service;



@Service( "lab1Bean" )

@Scope( "session" )

public class SimpleBean {



private TestBean bean;



@PostConstruct

public void init() {

System. out .println(bean.getData());

}



public void setBean(TestBean bean) {

this .bean = bean;

}

}




* This source code was highlighted with Source Code Highlighter .






実際、この場合、setBeanセッターの前に@Autowiredを置くと:

@Autowired

public void setBean(TestBean bean) {

this .bean = bean;

}




* This source code was highlighted with Source Code Highlighter .






彼はTestBeanのシングルトンをbinフィールドに注入し、コンソールには「私はシングルトンです!!」という大事なメッセージが表示されます。



2.コンストラクターに適用される@Autowired

状況は似ています-そのようなコンストラクターを追加する場合:

@Autowired

public SimpleBean (TestBean bean) {

this .bean = bean;

}




* This source code was highlighted with Source Code Highlighter .






コンソールには、待望の「I am a singleton !!」が表示されます。



3.メソッドに適用される@Autowired

最も興味深い状況は、このメソッドを追加します

@Autowired

public void doSomething(TestBean bean) {

this .bean = bean;

System. out .println( "I'm an autowired method and " + bean.getData());

}




* This source code was highlighted with Source Code Highlighter .






SpringはdoSomethingを自動的に呼び出し、TestBeanのインスタンスを渡します。 コンソールに以下が表示されます。

私は自動配線された方法であり、シングルトンです!!!

私はシングルトンです!!!

最初はdoSomethingを出力し、2番目はinitを出力します。

Beanフィールドの値を設定する必要があることに注意してください。Springはこれを行いません。 つまり、this.bean = bean;を記述しない場合、initメソッドはNullPointerExceptionを持ちます。

@Autowiredにはオプションのrequiredプロパティもあります。 required = falseの場合、Springはコンテキストで必要なBeanが見つからない場合でも例外をスローしません。 つまり、このようなクラスは非常に普通に作成されます。

package ru.mypackage;



import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Scope;

import org.springframework.stereotype.Service;



@Service( "lab1Bean" )

@Scope( "session" )

public class SimpleBean {



@Autowired(required= false )

private TestBean bean;



@PostConstruct

public void init() {

// System.out.println(bean.getData());

}



public void setBean(TestBean bean) {

this .bean = bean;

}

}




* This source code was highlighted with Source Code Highlighter .






修飾子の注釈



このアノテーションにより、@ Autowiredが必要とするBeanを指定できます。 修飾子は、1つの入力パラメーター(Beanの名前)を受け入れます。

@Autowired

@Qualifier( "specialTestBean" )

private TestBean bean;




* This source code was highlighted with Source Code Highlighter .






このコンストラクトは、specialTestBeanという名前のBeanのコンテキストを調べます。この例では、TestBeanが 'testBean'(@Service( "testBean"))という名前で宣言されているため、例外が発生します。

Qualifierに基づいて、独自のBean属性を作成できます。これは、Spring Reference Manualに非常によく書かれています(そして、重要なことに、非常に多くの例があります)。



リソース概要



リソース -Java EE 5およびJava 6の注釈。アクションは@Autowiredに似ています。 パラメーターとして、「name」はBeanの名前を使用できます。 上記の例を次のように書き換えることができます。

// @Autowired

//

@Resource

private TestBean bean;




* This source code was highlighted with Source Code Highlighter .






そして

// @Autowired

// @Qualifier("specialTestBean")

@Resource(name= "specialTestBean" )

private TestBean bean;




* This source code was highlighted with Source Code Highlighter .








これで、Spring IoCアノテーションは終了です。 いくつかの結論を引き出す必要があります...

注釈を構成するスタイルの出現により、Springは確かにスリムになり、より美しくなりましたが、実践が示すように、メカニズムはまだデバッグされていません。 少なくとも、Springを殺すと注釈付きBeanを受け入れたくない場合があり、XMLで記述されたBeanは簡単に飲み込みます。



All Articles