2011-01-15 19 views
1

私は様々なメソッドの実装と単一の抽象メソッドを含むサービスに使用する抽象基底クラスを持っています。私は単一サービス内で管理したい密接に関連するエンティティをいくつか持っているので、それらのエンティティの抽象基本サービスの匿名実装の構成にすることを計画しています。 Daoの実装を匿名サービスの実装に注入したいと思います。私はこのようなことをしようとしました。匿名実装へのSpring依存性注入

@Configurable 
@Service(value="compositeService") 
public class CompositeServiceImpl 
    extends BaseDataServiceAbstract<AnotherEntity, Long> 
    implements CompositeService 
{ 
    BaseDataServiceAbstract<MyObject, Long> myObjectService = 
     new BaseDataServiceAbstract<MyObject, Long>() { 

     @Resource(name="myObjectDao") 
     BaseDao<MyObject, Long> myObjectDao; 

     @Override 
     public BaseDao<MyObject, Long> getDao() 
     { 
      return myObjectDao; 
     } 
    }; 

    // other implementation methods and stuff 
} 

こうすれば、ダオは注入されません。私がdaoを含むクラスに移動すると、うまく動作します。私はそれを含むクラスに残しても構いませんが、匿名クラスの実装にそれを注入するためには何が必要かと思っています。

答えて

2

自分でnewを呼び出す限り、Springはクラスをインスタンス化しないため、依存関係を挿入することはできません。

デフォルトのコンストラクタをnewを使用して呼び出すことなく匿名クラスを作成することはできないため、Springがここで役立つ方法はありません。

+0

私はそれがコンテキストで動作するようになるかもしれないと思いました。コンパイル時の製織や何かのために、それは私の春の専門知識の境界を押し進めています。 – digitaljoel

+1

まあ、限界を押し上げる以上に、あなたがすでに完全に合法的な回避策を見つけたときの点は何ですか:同封のクラスに注射して –

+0

が合意しました。 – digitaljoel

2

あなたに正直言って、私はそれが可能ではないと思います。 daoをバネに注入するには、コンテキストローダーの起動時に最初にBeanをインスタンス化する必要があります。それはそれを認識していないので、それを行うことはできません。コンストラクタでインスタンス化するクラスを持つことに似ています。春はそれをインスタンス化しなかったので、それについてはわかりません。私は含まれているサービスクラスにDAOを追加することは、これを動作させる唯一の方法だと思います。あるいは、これらのクラスの具体的なインスタンスを作成し、コンテキストXMLに追加してサービスクラスに注入することもできます。あなたはそれらにダオを注入することができますが、私はあなたが最初にそれをしなかった理由があると仮定します。

2

これは直接行うことはできません。

  • 得る所有クラスにダオを注入し、@PostConsructでDAOを設定し、匿名のクラスのそれぞれにセッターを呼び出す(つまり手動で注入):ただし、2つの回避策がありますApplicationContext(いずれもApplicationContextAwareを実装するか、またはオートワイヤリングするとうまくいくと思います)@PostConstructappContext.getAutowireCapableBeanFactory().autowireBean(myObjectService)に電話してください。これは、オブジェクト自体がスプリングコンテキストの一部ではないにもかかわらず、これらのオブジェクトの依存関係をautowireにするようSpringに指示します。

しかし、一般的に言えば、定型的なコードを作成することはお勧めできません。もっと最適な解決方法があるはずです(私は全体の画像を持っていないので見えません)

関連する問題