AspectJの簡単な実装

AspectJでの実装

春の基本的な実装手順

  • 構成ファイルを作成します。オブジェクトを宣言し、同じ管理のためにオブジェクトをコンテナに転送します。<bean>またはアノテーションを使用できます
    。1)ターゲットオブジェクトを
    宣言します。2)アスペクトクラスオブジェクトを
    宣言します。3)自動プロキシジェネレータを宣言します。アスペクトフレームワークのタグ。
    自動プロキシジェネレータ:プロキシオブジェクトの自動作成を完了するために使用されます。

最初のステップ:aspectj依存関係を追加する

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>

ステップ2:ターゲットクラスを作成する

インターフェイスとその実装クラスを作成します(クラスのメソッドに機能を追加する必要があります)ここでも、Helloを使用して子を模倣します

package org.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Hello implements HelloInterface {
    
    
    @Value("yasuo")
    private String name;
    public void sayHello(String name){
    
    
        System.out.println(name+":pasaki");
    }

}

次に、ターゲットクラスを実行する前にシステム時刻を出力します

3番目のステップ:アスペクトクラスを作成します:通常のクラス

1)
クラスに@Aspectを追加します。2)クラスでメソッドを定義します。メソッドはアスペクトです。
3)メソッドの上にあるAspectJの通知アノテーションに追加する関数コードを実行します。たとえば、@ Beforeはエントリポイント式の実行を指定する必要があります()

package org.example;

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

import java.util.Date;

@Component
@Aspect
public class MyAspect {
    
    
    /*
    定义方法实现切面功能:
    1.公共方法
    2.方法没有返回值
    3.方法名称自定义
    4.方法可以有参数,也可以没有参数
    如果有参数,参数不是自定义的,有几个参数类型可以使用
     */

    //value是切入点表达式,表示切面的功能执行的位置

    @Before("execution(public void org.example.Hello.sayHello(String))")
    public void myBefore(){
    
    
        //功能代码
        System.out.println("切面功能,执行之前"+new Date());
    }
}

ステップ4:構成ファイルを作成する


Spring構成ファイルで関連するコンテンツを構成します。オブジェクトを宣言し、同じ管理のためにオブジェクトをコンテナーに渡します。<bean>またはアノテーションを使用できます
。1)ターゲットオブジェクトを
宣言します。2)アスペクトクラスオブジェクトを宣言します
。3)アスペクトJフレームワークラベルで自動プロキシジェネレータを宣言します。
自動プロキシジェネレータ:プロキシオブジェクトの自動作成を完了するために使用されます。

<?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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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 https://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="org.example"/>
<!--    声明自动代理生成器:使用aspectj框架内部的功能,创建目标对象的代理对象。
创建代理对象是在内存中实现的,修改目标对象的内存中的结构。创建为代理对象所以目标对象
就是被修改后的代理对象-->
<!--    aspctj-autoproxy:会把spring容器中的所有目标对象,一次性都生成代理对象-->
    <aop:aspectj-autoproxy/>
</beans>

テスト

        //1、指定spring配置文件的名称
        String config="spring_total" + ".xml";
        //2、创建表示spring容器的对象,ApplicationContext
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
        //3、通过容器获取对象
        HelloInterface hello = (HelloInterface) context.getBean("hello");
        hello.sayHello("yasuo");

ここに画像の説明を挿入

JoinPoint


通知メソッドのパラメーター指定します。JoinPointの役割は次のとおりです。メソッド名やメソッドの実際のパラメーターなど、通知メソッドのメソッド実行情報を取得できます。
アスペクト関数でメソッド情報が必要な場合は、
JoinPointパラメーターの値が追加されます。フレームワークによって指定された場合、それは最初のパラメーターである必要があります。

@Before("execution(public void org.example.Hello.sayHello(String))")
    public void myBefore(JoinPoint joinPoint){
    
    
        //获取方法完整的定义
        System.out.println("方法的签名(定义)="+joinPoint.getSignature());
        System.out.println("方法的名称="+joinPoint.getSignature().getName());

        //获取方法实参
        Object[] args = joinPoint.getArgs();
        for(Object arg:args){
    
    
            System.out.println("参数="+arg);
        }
        //功能代码
        System.out.println("切面功能,执行之前"+new Date());
    }

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_36976201/article/details/109005872