6

はっきりさせたかったのです。

AOPの概念について読み、横断的サービスを共有するための優れた方法であることを理解しました。(ロギング、セキュリティ、トランザクション...)

しかし、私はこのアイデアとその実装について何か言いたい/質問したいと思います。

AOPを私のビジネスロジックに同化させるために、AspectJ、JBOSSAOPのようないくつかの方法があることを読みました。

しかし、それはもうずっと前にここにありませんでしたか?

たとえば、コンポーネント(Java Beans、EJB'Sなど)間でロギングまたはセキュリティの実装を共有したいとします。

インスタンスが1つしかないことを確認して、シングルトンBeanを作成できなかったのはなぜですか。コンポーネントが必要になるとすぐに、ロギング/セキュリティサービスが検索され、そのサービスが使用されます。

なぜアスペクト指向やjbossAOPなどの「大きな」実装をすべて理解して持つ必要があるのでしょうか。ここで何が恋しいですか?

4

2 に答える 2

9

AOP の考え方は、共通のロジックを 1 か所に保持し (シングルトン ソリューションでも解決できます) 「見えない」(透過的) にすることです。AOP を使用すると、ロギング コードはビジネス ロジックの一部ではなく、舞台裏で「注入」されます。

また、より動的です。ログが必要になるたびにシングルトン サービスを呼び出す必要はありません。ポイントカットを 1 回構成するだけで (「このパッケージ内のすべてのセッター」など)、既存および新規のすべてのコードにログが適用されます。

さらに、AOP ははるかに柔軟で強力です。save*AOP 実装に尋ねることができます。「 " で始まり、引数を 1 つ取るメソッドを呼び出すたびに、トランザクションを開始してください」または「 を返すメソッドCustomerが からサブクラス化された例外をスローする場合はIllegalAgumentException、そのメソッドを再度呼び出してください」。

AOP は、共通のロジックをグループ化するだけではありません。

于 2012-06-10T14:42:13.103 に答える
6

あなたは AOP が何であるかを理解していません。AOPのアイデアは、書くことができることです

public void foo() {
    // some business code
}

書く代わりに

public void foo() {
    LogManager.getInstance().log("entering foo...");
    SecurityManager.getInstance().checkUserInRole("fooer");
    TransactionManager.getInstance().startTransaction();
    try {
        // some business code
        TransactionManager.getInstance().commit();
    }
    catch(RuntimeException e) {
        TransactionManager.getInstance().rollback();
        throw e;
    }
    LogManager.getInstance().log("leaving foo...");
}

すべての分野横断的な問題 (ロギング、セキュリティ、トランザクション管理) は、ビジネス コードと混ざり合ったり、うんざりするようなことを繰り返したりするのではなく、ビジネス コードの外にあります。

于 2012-06-10T14:45:58.153 に答える