2012-02-28 5 views
0

私はその方法を理解していますが、正式にその定義を形作ることはできません。スプリングDI?インターフェイスタイプ?

知られているように、DIはコンストラクタまたはセッタまたはインターフェイスを介して実行できます。 私は最新のone-interfaceベースのDIについて混乱しています。これはSpringで使用されていますか?

更新:私は間違った理解につながったここで悪いexamleを与えた。

それを修正するには、次の

は、我々が持っているセッター、セッターに我々はいくつかのクラスによって実装されるインタフェースを注入言います。それはセッターやインターフェイス経由でDIと見なされますか?

http://martinfowler.com/articles/injection.html#UsingAServiceLocator この記事は上のDIを分割:。。

「依存性注入には主に3つのスタイルがありますが、私は彼らのために使っている名前は、コンストラクタ・インジェクション、セッター・インジェクション、およびインターフェイス注入されている場合あなたはType IoC(インターフェイスインジェクション)、タイプ2 IoC(セッターインジェクション)、タイプ3 IoC(コンストラクタインジェクション)と呼ばれるInversion of Controlに関するこのディスカッションでこのことについて読んでいます。覚えていないので、私はここにある名前を使ったのです」

これ以外のIoCに使用されるサービスロケータパターンは、実際に@Autowiredを可能にするものですか?つまり、私が正しくリコールすれば、それらを@Repositoryまたは@Controllerまたは同様に宣言することができるので、すべてのクラスをxmlで明示的に宣言する必要はありません。インターフェースをオートワイヤリング

おかげで、

答えて

3

ワイヤにそのインターフェースを実装するBeanを意味します。これは実際にBeanファクトリに存在する実装に依存します。

@Autowired 
UserService us; // wire a bean implementing UserService 

- 注目に値する

@Service 
public class UserServiceImpl implements UserService { 
    // the @Service annotation causes this implementation of UserService to 
    // be made available for wiring in the bean factory. 
} 

インターフェースによって、あなたがワイヤーあれば、春には、そのインターフェイスを実装する豆の工場で1と正確に一つのBeanを存在するとそこに期待していますされていること。複数のBeanが見つかった場合は、エラーがスローされ、どのBeanを接続するかを指定する必要があります(@Qualifierアノテーションを使用)。

EDIT:

ときに配線、することができますワイヤーメンバ変数またはsetterメソッドのいずれか。

@Autowired 
UserService us; 

-

@Autowired 
public void setUserService(UserService us) { 
    this.us = us; 
} 

これら二つは同じ結果をもたらします。違いは、前者の場合、Springはリフレクションを使用して変数usをUserServiceを実装するBeanに設定することです。後者の場合、SpringはsetUserServiceメソッドを呼び出し、同じUserService関数を渡します。

+0

他のDIメソッドと比較してみてください。今はもっと混乱しています。私は意味を持っていますが、@Autowiredをしばらくお待ちください。(コンテキストを忘れる:コンポーネントスキャン - 私たちはそれを持っていないと言う)私は、セッターとインターフェイスを介してDIの違いを見せてください - あなたはsetterでインターフェイスを設定することができます - そして、それはインターフェイスまたはセッター経由で呼び出されるでしょうか?そして、なぜそれが正式にDI上でSetter OR Interfaceを介して分割されるのですか? – Aubergine

+0

"セッターとインターフェースを介したDIの違い" - リンゴとオレンジは、お互いに関係ありません。上記の編集を参照してください。 – pap

+0

私はあなたが何をしているのか、それがどのように機能しているのかを正確に理解しています(私は自分で実装しましたが、鮮やかに動作します)。しかし、なぜ記事の作者は、セッターとコンストラクターの注入とラインに沿ってインターフェイス注入を配置するのですか? – Aubergine

関連する問題