2

Javaで簡単なプログラムを作ってみました。

私が持っているプログラムでは:

1) Person クラス - 注釈付きメソッドを使用

2) アスペクト クラス。

今私がやろうとしているのは、人の名前が設定される前に、いくつかのデータをログ ファイルとコンソールに出力することです。

だからこれは私がやったことです:

人物クラス

package pack.bl;

import org.springframework.stereotype.Component;
import pack.aop.LogLevel;
import pack.aop.TestAnnotation;

@Component
public class Person {

private String name,dest;
public Person(String name,String dest)
{
    this.setName(name);
    this.setDest(dest);
}

public String getName() {
    return name;
}

@TestAnnotation(value=LogLevel.INFO)
public void setName(String name) {
    this.name = name;
    System.out.println("Im " + this.toString() + " My name was changed to " + name);
}

public String getDest() {
    return dest;
}

@TestAnnotation(value=LogLevel.INFO)
public void setDest(String dest) {
    this.dest = dest;
}

@Override
public String toString()
{
    return this.name + "\n";
}

public static void main(String[] args) {
    Person p = new Person("Person1","Kripton");
    p.setName("Person2");
}

}

アスペクト クラス

package pack.aop;

import java.util.Arrays;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.test.context.ContextConfiguration;


@Aspect
@ContextConfiguration(locations = {
        "applicationContext.xml"})

public class BeforeAdvice {

private Log logger = LogFactory.getLog("Logger");

@Before("@annotation(testAnnotation)")
public void myBeforeLogger(JoinPoint joinPoint,TestAnnotation testAnnotation)
{
    System.out.println("Okay - we're in the before handler...");
    System.out.println("The test annotation value is: " + testAnnotation.value());
    Signature signature = joinPoint.getSignature();
    String methodName = signature.getName();
    String stuff = signature.toString();
    String arguments = Arrays.toString(joinPoint.getArgs());
    logger.info("Write something in the log... We are just about to call method: "
    + methodName + " with arguments " + arguments + "\nand the full toString: "
    + stuff);
}

}

ApplicationContext.xml ファイル:

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

<aop:aspectj-autoproxy/>

<context:component-scan base-package="pack.bl.Person"/>

*注: LogLevel列挙型です。そのように動作する必要があります。プログラムを実行して人の名前を設定するときは、最初に Aspect クラスの「BeforeAdvice」(setName に@testAnnotationで注釈が付けられているため) メソッドに移動し、実行する必要があります。このメソッド..その後、setName メソッドに戻って人物名を設定する必要があります。*

もう1つ、testAnnotationは私が作成したAnnotationです

4

1 に答える 1

4

質問で織り方については何も言及していません。私が見る限り、Spring コンテナーにジョブを委譲しているように見えます。しかし、AspectJ ではなく Spring AOP を使用しています。Spring AOP でも AspectJ アノテーションを使用できますが。

私の提案は、それを 2 つのケースに分けることです。最初に AspectJ アスペクトが織り込まれていることを確認し、 のみを使用する単純なアドバイス メソッドを使用System.out.println(..)してから、Spring 構成がアスペクトおよび Log 列挙型と統合されていることを確認します。

AJDT Eclipse プラグインを使用して Web を作成する

AspectJ ウィービングを有効にする最も簡単な方法は、AspectJ プラグインを使用し、コンパイル時のウィービングを使用することです。プロジェクトを右クリックして AspectJ nature を有効にすると、アドバイスが織り込まれているコードにオレンジ色の矢印が表示されます。例については、以下の図を参照してください。

ポイントカットが機能するかどうかはわかりません。アドバイスがどこにも織り込まれていない場合は、代わりに次のポイントカットを試してください。

@Pointcut("execution(@pack.aop.TestAnnotation * *(..)) ")
public void logMethod() {}

そして、次のようにアドバイスします。

@Before("logMethod()")
public void beforeLogMethod(JoinPoint joinPoint) {
    System.out.println("Logging..");
}

アスペクトと列挙型を Spring コンテナーに統合する

次に、Spring コンテナーの前にアスペクトが作成されるため、アスペクトのファクトリ メソッドからアスペクトを取得するAspects.aspectOf(pack.aop.BeforeAdvice.class)か、Spring 構成でファクトリ メソッドを使用する必要があります。

Spring XML 構成から、次のようにアスペクト (オブジェクト) を取得できます。

<bean id="beforeAdvice" class="apack.aop.BeforeAdvice"
    factory-method="aspectOf" />

Spring コンテナーの外部で作成されたロガーを取得するには、factory-method も使用する必要があります。

私は関連するブログ投稿を書きました。これは、ほとんどの問題の例と、AJDT Eclipse プラグインがいかにエレガントに機能するかを示す図で説明しています。

ここに画像の説明を入力

この画像は、アフター アドバイスを示す 2 つの矢印を示し、最後の矢印はアラウンド アドバイスを示しています。

于 2012-08-29T09:46:45.363 に答える