0

私はこのような多くの方法を持っています:

    Connection connection = null;
    try {
        connection = new Connection();
        connection.connect();
        .... // method body

    } finally {
        if (connection != null) {
            connection.disconnect();
        }
    }

この部分をアスペクト(AspectJ)に除外することはできますか?

4

2 に答える 2

2

接続管理をアラウンド アドバイスに抽出Connectionし、ThreadLocal. 静的プロパティを持つパブリック クラスを定義します。

public class ConnectionHolder {
  public static final ThreadLocal<Connection> connection = new ThreadLocal<>();
}

周囲のアドバイスではThreadLocal、オープン接続に設定し、後で無条件にクリアする必要があります。これはThreadLocals の最大の落とし穴です: 関係のないコンテキストにオブジェクトをリークします。また、子スレッドが を継承することに注意してくださいThreadLocal(WebSphere では、これに関する問題が 1 回ありました)。

全体として、ThreadLocals は非常に汚いソリューションですが、それ以外の場合は、Spring のような依存性注入フレームワークを使用したり、リクエスト スコープの Bean を構成したりする必要があります。これは良い考えですが、さらに調査が必要になります。あなたの部分。

于 2013-02-12T09:25:31.183 に答える
0

または、テンプレート パターンを使用して接続配管を抽出し、コピー/貼り付けを回避できます。基本的な考え方は次のようなものです。

abstract ConnectionTemplate {
    private Connection connection = // ...

    /**
     * Method to be implementad by child classes
     */
    public abstract void businessLogicCallback(); 

    /**
     * Template method that ensure that mandatory plumbing is executed
     */
    public void doBusinessLogic() {
        try {
            openConnection();
            // fetch single result, iterate across resultset, etc
            businessLogicCallback();
        finally {
            closeConnection();
        }
    }

    void openConnection() {
        connection.open();
    }

    void closeConnection() {
        if (connection != null) {
            connection.close();
        }
    }
}

これで、クラスの実装は次のように簡単になります。

class ImportantBusinessClass extends ConnectionTemplate {

    @Override
    public void businessLogicCallback() {
        // do something important
    }
}

そして、あなたはそれを次のように使用します

ImportantBusinessClass importantClass = new ImportantBusinessClass();
importantClass.doBusinessLogic();      // opens connection, execute callback and closes connection

Spring フレームワークは、いくつかの場所でこの手法を使用します。特に、JdbcTemplateは、SQL、接続、行とドメイン オブジェクト間のマッピングなどを処理します。実装の詳細については、GitHubのソース コードを参照してください。

于 2013-02-12T06:44:30.740 に答える