2011-07-05 11 views
1

さらに、WorldRepositoryが今Springの@Autowiredは実装されていないインターフェースでどのように動作しますか?

public interface WorldRepository extends MyWorldRepository, 
             GraphRepository<World>, 
             NamedIndexRepository<World> 
{/* no method defined here */} 

奇数一部...のように定義され、無クラス

...

@Autowired private WorldRepository worldRepository; 
を私は SpringData's Neo4j graph DB hello-worlds exampleで働いていると私は WorldRepositoriesImpl.javaに次のコードを渡って走りました私は実際に WorldRepositoryを実装することができます。したがって、いくつかの質問...

これはどのように可能ですか?これはどこに文書化されていますか?これをもっと明白にする方法はありますか?

答えて

3

デバッガが接続されたコードを実行すると、Springによって配線されたworldRepositoryインスタンスが実行時に作成されたプロキシオブジェクトであることが示されます。

pom.xmlとその依存関係を見ると、実行時にこの実装クラスを作成するいくつかのアスペクトのspring-neo4jライブラリバンドルのように見えます。

つまり、このインタフェースはソースコードで宣言されていませんが、実行時にAspectJなどのツールで作成されます。

IntelliJ screenshot of debugger

+0

「何が起こっているのですか」。まだまだ私にとっては魔法のように思えますし、3つの別々のインターフェイス(クラスの1つがクラスで定義されています)からクラスを構成する方法が少しずつ分かりません。理想的には私がまだ見つけていないこれを説明する文書を見たいと思います。これをもっと明示的にする方法が欲しいと思います。 –

+0

それは確かに魔法です。キーは、コード合成を行うことです(おそらく、存在する他のクラス/ Bean /メソッドに委譲することによって)。 –

+0

@Andrew、 'NodeGraphRepository'と' org.springframework.data.graph.neo4j.support.relationship.Neo4jRelationshipBacking'を見て、彼らはほとんどの作業をしているようです。しかし、それ以外に便利なものが見つからない場合は、ライブラリの作者にドキュメントを改善しなければならないと思います。 –

関連する問題