Spring AOPのアノテーション設定

Spring AOPのアノテーション設定

(1)簡単な説明

前回、Spring AOPの実装原理について話しましたが、実際にこの関数を独自のプログラミングで実装することは依然として非常に面倒です。したがって、Springは、対応する構成メソッドを提供します。これにより、開発プロセスを簡素化し、ビジネスロジックに完全に集中できるようになります。

AOPのアノテーション構成を理解する前に、AOPの専門用語に注意を払う必要があります。

Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。
Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。
Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知,通知分为:前置通知,后置通知,异常通知,最终通知,环绕通知。
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field。
Target(目标对象):代理的目标对象。
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。
Proxy(代理):一个类被AOP织入增强后,就产生一个代理类。
Aspect(切面): 是切入点和通知的结合。

これらの概念を見てみましょう。覚えておく必要があるのはいくつかの点だけです。1つ目は、AOPのA(アスペクト)であるアスペクトの概念です。これは、エントリポイントと通知の組み合わせです。簡単に言えば、プログラムの追加機能であり、この機能の位置です。エントリーポイントはエントリーの通知の位置であり、コネクションポイントはエントリーポイントとして使用できる位置です(必ずしも切り取られる必要はありません)。理解を深めるには、アスペクト拡張プログラミングの中核となる拡張機能(ログを書き込む機能など)を追加する必要があることを理解する必要があります。先ほど説明した重要なポイント、接続ポイント、エントリポイント、通知、アスペクトを整理しましょう。

ここに画像の説明を挿入

この記事では、従来のXML構成メソッドではなく、@ Aspectに基づくアノテーション構成メソッドについて説明します。XML構成は扱いにくく、理解しにくいため、アノテーション構成方法の方が理解しやすいです。ただし、これは後で注釈の選択と密接に関連するため、理解の前提は上記の概念を完全に理解することです。

(2)簡単な例

簡単な例を見て、AOPの構成方法を調べてみましょう。まず、依存関係をインポートする必要があります。pom.xmlファイルに依存関係を追加する必要があります。

<dependency>
	<groupId>org.aspectj</groupId>
  	<artifactId>com.springsource.org.aspectj.weaver</artifactId>
  	<version>1.6.4.RELEASE</version>
</dependency>

これは、@ Aspectアノテーションを使用するために必要な依存関係です。もちろん、Springフレームワークの依存関係もいくつか必要です。ここでは記述しません。

次に、構成ファイルを作成する必要があります。ここでは主にAOP名前空間と制約を追加し、@ AspectJアノテーション構成メソッドを開きます。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bean="http://www.springframework.org/schema/context"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd"
       xmlns:aop="http://www.springframework.org/schema/aop">

    <aop:aspectj-autoproxy/>
    <context:component-scan base-package="com.test"/>
</beans>

コアメソッドを記述します。これは、次のように割り込まれます。

package com.test;

import org.springframework.stereotype.Component;

@Component("Hello")
public class Hello {
    
    
    void sayHello(String s){
    
    
        System.out.println("hello " + s);
    }
}

次に、最も重要な部分であるアスペクトを記述します。前述のように、アスペクトは2つの部分に分かれています。1つはエントリポイントで、もう1つは通知です。最初に、@ Aspectアノテーションをアスペクトクラスに追加して、これがアスペクトであることを示す必要があります(注:IOCコンテナに含まれているBeanオブジェクトにのみ@Aspectで注釈を付けることができます)。次に、通知メソッド、つまり必要な追加機能、この場合はbeforeメソッドとafterメソッドを記述します。メソッドだけでは十分ではないため、メソッドにアノテーションを追加して、これが通知であることをSpringに通知する必要があります。通知タイプを説明する5つの注意事項があります。

ここに画像の説明を挿入
これらの5つの注釈は、事前通知、通知後、最終通知、例外通知、サラウンド通知の5つの通知方法に対応しています。これらは実際には通知のタイミングなので、誰もが通知のタイミングを知ることができます。通知のタイミングは十分ではなく、特定のエントリポイント(エントリポイント)も必要であり、これは注釈内の文字列の役割です。この文字列の専門用語はインジケーターと呼ばれます。インジケーターの種類の数を見てみましょう:

ここに画像の説明を挿入

最も一般的に使用されるインジケーターは、メソッドの実行を表すexecution()インジケーターです。インジケーターのパラメーターには、完全なクラス名+メソッド名を入力してメソッドを決定する必要があり、戻り値とパラメーターは必要に応じて追加することもできます。このケースで入力するのは、プロジェクト内のメソッドを一意に特定できるように、完全なクラス名+メソッド名です。これも原則を明確に示しています。エントリポイントとして使用できるのはメソッドのみです。つまり、すべてのメソッドは入力可能な接続ポイントです。

package com.test;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component("Logger")
public class Logger {
    
    
    @Before("execution(* com.test.Hello.sayHello(..))")
    void before(){
    
    
        System.out.println("before hello");
    }

    @After("execution(* com.test.Hello.sayHello(..))")
    void after(){
    
    
        System.out.println("after hello");
    }
}

このようにして、AOP構成の式を要約できます。XX通知(5つの通知タイプの1つで、アノテーションを使用して構成)は、XXでターゲットメソッド(通知タイプアノテーションの文字列)に切り込み、XX関数(通知メソッド、傲慢)。これが当てはまるかどうかを確認するには、上記のコードに対応するようにしてください。

2020年7月30日

おすすめ

転載: blog.csdn.net/weixin_43907422/article/details/107655195