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());
}