2011-08-03 13 views
2

のは、私は次の依存関係を持っているとしましょう:春 - 「遅延バインディング」autowired豆

@Configuration 
public class MyCfg { 
    // ... 
    @Bean 
    public Session session() { 
    return sessionFactory().getCurrentSession(); 
    } 
} 

@Repository 
@Transactional 
public class MyRepo { 
    @Autowired 
    private Session session; 
} 

sessionFactory()が正しく設定されています。私がSessionの代わりにSessionFactoryを注入すると、うまく動作します。しかし、Sessionを試してみると、セッションにスレッドがバインドされていないため、コンテナのブートストラップで例外が発生して死んでしまいます。

リポジトリが@Transactionalなので、実行時にセッションが存在することがわかりました。実行時にAOPで初期化されたSessionを注入するように、どうすれば動作させることができますが、レポがインスタンス化されたときにそれを解決しませんか?

答えて

0

この方法では多くの問題が発生します。 Sessionを注入する代わりに、今シングルトンとして自動的にスコープを設定する代わりに、SessionFactoryを注入する必要があります。 Sessionのインスタンスは、これらの取引のルールに従うことになります@Transactionalアノテーション付きメソッド内に取得例:

@Transactional(readonly=true) 
public List<Person> getPersons() { 
    Session session = sessionFactory.getCurrentSession(); 
    //find those darn people. 
} 
@Autowired 
private SessionFactory sessionFactory; 
+0

私はそれを行う方法を知っています、それはまさに私が避けようとしているものです。私はあまりにも多くの工場や定型文句が浮かび上がることを望んでいません。 –

2

このビットはSpring documentation regarding bean scopesです。下部には@Scope注釈の使用方法が示されています。session()メソッドに適用する場合は、MyCfgにしてください。 「request」値を使用して、入ってくる各HTTP要求に対してこのBeanの新しいインスタンスを作成するように思えます。<aop:scoped-proxy/>要素を見て、設定することをお勧めします。ドキュメンテーションで数回述べられており、あなたがしようとしていることに役立つかもしれません。

+0

私は1つの要求につき1つのトランザクションが複数ある場合は? –

+0

私は完全にはわかりませんが、この場合はカスタムスコープを構築する必要があります。カスタム 'トランザクション'スコープを作成する方法については、ドキュメントの3.5.5項を参照してください。 –

関連する問題