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は簡単に飲み込みます。

Source: https://habr.com/ru/post/J48606/


All Articles