1

私はいくつかのSpring管理クラスを(xml構成を介して)持っています。そのうちの1つはSessionFactoryで、別のSpring管理クラスに注入されます。このクラスが新しいセッションを必要とするときはいつでも、SessionFactory で createSession を呼び出します。

ただし、私が間違っていない限り、これはセッション自体が Spring で管理されていないことを意味します。これは、Bean を Spring で管理する必要があるいくつかの @Transactional メソッドがあるため、問題があります。

私は FactoryBeans について調べてきましたが、特に私の createSession メソッドはパラメーターを受け取り、FactoryBean.getObject() はパラメーターを受け取っていないため、これを行う最善の方法がわかりません。

getObject を使用して、パラメータを手動で上に設定することもできますが、可能であれば、ファクトリに強制的に設定したいと考えています。

誰でも助けることができますか?前もって感謝します。簡単な例を以下に示します。

public class SessionFactory {

    public final Session createSession(String username){
        Session session = new SessionImpl(username);
        return session;
    }

}


public class SessionImpl implements Session{

    private String username;

    @Override
    @Transactional
    public void doSomething(){
        // Does something
    }

    public void setUsername(String username){
        this.username = username;
    }

    public String getUsername(){
        return username;
    }

}


public class Service {

    private SessionFactory sessionFactory; // Set by Spring through xml config

    public void doSomethingServicy(){

    }

    public void setSessionFactory(SessionFactory sessionFactory){
        this.sessionFactory = sessionFactory;
    }


}
4

2 に答える 2

1

@Transactionalアノテーションが間違った場所にあると思います。

トランザクションである必要があるのはセッションではありません。ユースケースを満たすインターフェイスベースのサービスメソッドに適用する必要があります。それが典型的な春のイディオムです。フォローすることをお勧めします。

于 2013-01-02T10:39:21.350 に答える
1

以下に示すように、Spring でファクトリ Bean を作成し、ファクトリ Bean とファクトリ メソッドを使用してプロトタイプ スコープの Session オブジェクトを宣言することで、この問題を解決しました。

<bean id="sessionFactory" class="com.SessionFactory" >
        <property name="dependencyA" ref="dependencyA" />
        <property name="dependencyB" ref="dependencyB" />
</bean>

<bean id=session" class="com.SessionImpl" factory-bean="sessionFactory" factory-method="createSession" scope="prototype" />

次に、必要に応じてコードで新しいインスタンスを取得します。

Session session = (Session) applicationContext.getBean(SpringConstants.SESSION_BEAN_NAME, username);

ここでユーザー名は、ファクトリメソッドObject...に渡される引数を構成するメソッド パラメータの一部です。createSession

プログラムの構造が改善される可能性があることに感謝しますが、コードの制限を考えると、問題はうまく解決されます。

于 2013-01-04T13:53:24.853 に答える