六、春AOP予備的な理解

春AOPの予備的な理解

[1] AOPの概要

AOPとは何ですか?(百度から)

ソフトウェア業界では、AOPを意味し、アスペクト指向プログラミングのための略語です:アスペクト指向プログラミングを、事前にコンパイラの方法で均一なメンテナンスプログラムの実行時に動的プロキシの実装によって技術を採用しています。AOPは、ソフトウェア開発のホットスポットで、重要な要素は、Springフレームワークで、OOPの継続である関数型プログラミングYanshengファンタイプです。AOPは、開発の効率を向上させつつ、ビジネス・ロジックは、プログラムの再利用性を向上させ、部品間の結合の程度を低減するようなビジネス・ロジックの各部分を分離するために使用することができます。

その後、我々は単純な栗を与える(から:SpringのAOP

私たちは、一般的な活動は、一般的には、(エンドかどうかなど、起動するかどうか)の活動の有効性を検証するインターフェイスごとに行いますか、このインターフェイスは、ユーザのログインではありません。

通常のロジックによると、我々はそれを行うことができます。

IMG

この問題は、どのように多くのインターフェイス、何回コードのコピーがします。耐え難いである、「怠け者」のために。さて、私たちは、このインターフェースを呼び出すための各インターフェイスを一般的な方法を提案しました。ここではセクションの少し味です。

IMG

また、そこに私はいつものコードをコピーしませんが、問題は、ですが、各インタフェース奨め呼び出し、このメソッド権利。次いで、概念セクションがあり、どこかの方法(カットオフポイント)インターフェース呼び出しを注入します。

IMG

このようなインターフェイスは、唯一の非インタフェースの懸念の他のロジックや処理に注力することなく、特定のビジネスニーズに関係します。

レッドボックスは、アスペクト指向プログラミングです。

[2]用語&関連AOP

概念定義

  • 態様(セクション):アスペクトはアスペクトは、いくつかのポイントカットし、対応する情報に含まれる、Java(登録商標)と同様クラス宣言を宣言する。
  • 関節点(接続点):ネスト他の関節点もできる典型的なメソッド呼び出しを含むプログラムで明確に定義された点を示し、等とアクセスクラスのメンバ例外ハンドラブロック自体を行います。
  • Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
  • Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
  • Target(目标对象):织入 Advice 的目标对象.。
  • Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

Advice 的类型

  • before advice(前置通知), 在 join point 前被执行的 advice.
  • after return advice(后置通知), 在一个 join point 正常返回后执行的 advice
  • after throwing advice(异常通知), 当一个 join point 抛出异常后执行的 advice
  • after advice(返回通知), 无论一个 join point 是正常退出还是发生了异常, 都会被执行的 advice.
  • around advice(环绕通知), 在 join point 前和 joint point 退出后都执行的 advice. 这个是最常用的 advice.
  • introduction(引介),introduction可以为原有的对象增加新的属性和方法。

【3】AOP示例

​ 首先,创建一个OrderService,写一个添加订单的方法:

public class OrderService {
    public void addOrder(){
        System.err.println("添加订单...");
    }
}

​ 我们要为这个方法运行前后添加通知方法,写一个切面类:

@Aspect
public class LogAspects {

    @Pointcut("execution(* com.zl.springBase.aop.OrderService.*(..))")
    public void pointCut(){}
    @Before("pointCut()")
    public void logBegin() {
        System.out.println("开始添加订单了...");
    }
    @After("pointCut()")
    public void logEnd() {
        System.out.println("订单添加结束...");
    }
    @AfterReturning("pointCut()")
    public void logAfter() {
        System.out.println("订单添加正常结束...");
    }
    @AfterThrowing("pointCut()")
    public void logException() {
        System.out.println("订单添加出现异常...");
    }
}

コンテナその後、この2つのクラス:

@Configuration
@EnableAspectJAutoProxy
public class MainConfig {

    @Bean
    public OrderService orderService(){
        return new OrderService();
    }

    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }
}

テストクラスメソッドで実行されている順序を追加します。

@ContextConfiguration(classes = {MainConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class TestAspects {
    @Autowired
    private ApplicationContext applicationContext;
    @Test
    public void test(){
        OrderService orderService = applicationContext.getBean(OrderService.class);
        orderService.addOrder();
    }
}

次のように図の結果は以下のとおりです。

おすすめ

転載: www.cnblogs.com/lee0527/p/11756100.html