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です