English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Spring AOP AspectJ XML設定の例

Springは、XMLファイルでアスペクト、アドバイス、ポイントカットを定義できるようにします。

前のページでは、アノテーションを使用したaopの例を見ました。今度は、XML設定ファイルを使用して同じ例を見てみましょう。

アドバイスを定義するために使用されるXML要素について見てみましょう。

aop: 之前 実際のビジネスロジックメソッドの呼び出しの前に適用されます。 aop: 後 実際のビジネスロジックメソッドの呼び出しの後で適用されます。 aop: 返後実際のビジネスロジックメソッドの呼び出しの後で適用されます。通知の返値をインターセプトするために使用できます。 aop: アラウンド 実際のビジネスロジックメソッドの呼び出しの前後で適用されます。 aop: 投後実際のビジネスロジックメソッドが例外をスローした場合、それを適用します。
注意: aopの概念やその利点などについて学ぶには、こちらを訪れてください。AOP概念のチュートリアル

1、aop: before

実際のビジネスロジックメソッドの前に「先行AspectJアドバイス」を適用します。ここで、変換、認証などの操作を行うことができます。

実際のビジネスロジックを含むクラスを作成します。

ファイル: Operation.java
package com.w;3codebox;
public  class Operation{
	public void msg(){System.out.println("msg method invoked");}
	public int m(){System.out.println("m method invoked");return 2;}
	public int k(){System.out.println("k method invoked");return 3;}
}

ここでは、アドバイスの前に含まれる側面クラスを作成します。

ファイル: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp)//it is advice
	{
		System.out.println("additional concern");
		//System.out.println("Method Signature: ");  + jp.getSignature());
	}
}

现在创建定义bean的applicationContext.xml文件。

ファイル: 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
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy />
<bean id="opBean" class="com.w3codebox.Operation">	</bean>
<bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @Before -->
     <aop:pointcut id="pointCutBefore"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:before method="myadvice" pointcut-ref="pointCutBefore" />
  </aop:aspect>
</aop:config>
</beans>

今、実際のメソッドと呼びます。

ファイル: Test.java

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation e = (Operation) context.getBean("opBean");
		System.out.println("calling msg...");
		e.msg();
		System.out.println("calling m...");
		e.m();
		System.out.println("calling k...");
		e.k();
	}
}

出力

calling msg...
追加の懸念
msg() method invoked
calling m...
追加の懸念
m() method invoked
calling k...
追加の懸念
k()メソッドが呼び出されました

ご覧の通り、msg()、m()、k()メソッドを呼び出す前に、他の問題を出力しています。


2、aop: 後の例

実際のビジネスロジックメソッドの呼び出しの後、通知の後のAspectJが適用されます。ログの保守、セキュリティ、通知などに使用できます。

ここでは、以下のように仮定しています。 Operation.java TrackOperation.java Test.java 文件与aop: 中的示例相同。

现在创建定义bean的applicationContext.xml文件。

ファイル: 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
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy />
<bean id="opBean" class="com.w3codebox.Operation">	</bean>
<bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @After -->
     <aop:pointcut id="pointCutAfter"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:after method="myadvice" pointcut-ref="pointCutAfter" />
  </aop:aspect>
</aop:config>
</beans>

出力

calling msg...
msg() method invoked
追加の懸念
calling m...
m() method invoked
追加の懸念
calling k...
k()メソッドが呼び出されました
追加の懸念

您可以看到在调用msg(),m()和k()方法之后,还会出现其他问题。


3、aop: 返回后的示例

通过在返回建议后使用,我们可以在建议中获得结果。

创建

ファイル: Operation.java

package com.w;3codebox;
public  class Operation{
	public int m(){System.out.println("m() method invoked");return 2;}
	public int k(){System.out.println("k() method invoked");return 3;}
}

创建返回建议后包含的方面类。

ファイル: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp,Object result)//it is advice (after advice)
	{
		System.out.println("additional concern");
		System.out.println("Method Signature: ");  + jp.getSignature());
		System.out.println("Result in advice: ")+result);
		System.out.println("end of after returning advice...");
	}
}

ファイル: 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
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy />
<bean id="opBean" class="com.w3codebox.Operation">	</bean>
<bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @AfterReturning -->
     <aop:pointcut id="pointCutAfterReturning"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:after-returning method="myadvice" returning="result" pointcut-ref="pointCutAfterReturning" />
  </aop:aspect>
</aop:config>
</beans>

ファイル: Test.java

現在実際のメソッドを呼び出すTestクラスを作成しています。

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation e = (Operation) context.getBean("opBean");
		System.out.println("calling m...");
		System.out.println(e.m());
		System.out.println("calling k...");
		System.out.println(e.k());
	}
}

出力

calling m...
m() method invoked
追加の懸念
メソッドシグネチャ: int com.w3codebox.Operation.m()
アドバイスの結果: 2
after returningアドバイスの終わり...
2
calling k...
k()メソッドが呼び出されました
追加の懸念
メソッドシグネチャ: int com.w3codebox.Operation.k()
アドバイスの結果: 3
after returningアドバイスの終わり...
3

返り値が2度にわたって印刷されることが見られます。1度目はTrackOperationクラス、2度目はTestクラスです。


4、aop: around

AspectJの周囲アドバイスは、実際のビジネスロジックメソッドが呼び出される前後で適用されます。

クラスを作成します

ファイル: Operation.java

package com.w;3codebox;
public  class Operation{
	public void msg(){System.out.println("msg()が呼び出されました");}
	public void display(){System.out.println("display()が呼び出されました");}
}

围绕アドバイスのアスペクトクラスを作成します。

adviceメソッドに渡す必要があります PreceedingJoinPoint それにより、proceedを呼び出してリクエスト()メソッドを通じて要求を行うことができます。

ファイル: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.ProceedingJoinPoint;
public class TrackOperation
{
	public Object myadvice(ProceedingJoinPoint pjp) throws Throwable 
	{
		System.out.println("実際のメソッド呼び出しの前の追加の懸念");
		Object obj=pjp.proceed();
		System.out.println("実際のメソッド呼び出しの後の追加の懸念");
		objを返します;
	}
}

ファイル: 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
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy />
<bean id="opBean" class="com.w3codebox.Operation">	</bean>
<bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @Around -->
     <aop:pointcut id="pointCutAround"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:around method="myadvice" pointcut-ref="pointCutAround" />
  </aop:aspect>
</aop:config>
</beans>

ファイル: Test.java

現在実際のメソッドを呼び出すTestクラスを作成しています。

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext context = new classPathXmlApplicationContext("applicationContext.xml");
		Operation op = (Operation) context.getBean("opBean");
		op.msg();
		op.display();
	}
}

出力

実際のメソッド呼び出し前に追加の懸念
msg()が呼び出されます
実際のメソッド呼び出し後の追加の懸念
実際のメソッド呼び出し前に追加の懸念
display()が呼び出されます
実際のメソッド呼び出し後の追加の懸念

msg()とメソッドの表示の前後で他の問題もプリントアウトされます。


5、aop: after-throwing

TrackOperationクラスで例外をプリントアウトできるように、アフターアドバイスを使用します。AspectJのAfterThrowingアドバイスの例を見てみましょう。

包含業務ロジックのクラスを作成します。

ファイル: Operation.java

package com.w;3codebox;
public  class Operation{
	public void validate(int age)throws Exception{
	if(age<18){
		throw new ArithmeticException("Not valid age");
	}
	else{
		System.out.println("Thanks for vote";
	}
	}
}

引发建议后包含的方面类创建。

ここでは、Throwableの参照を渡す必要があります。そうすることで、ここで例外をキャッチすることができます。

ファイル: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp,Throwable error)//it is advice
	{
		System.out.println("additional concern");
		System.out.println("Method Signature: ");  + jp.getSignature());
		System.out.println("Exception is: ");+error);
		System.out.println("end of after throwing advice...");
	}
}

ファイル: 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
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy />
<bean id="opBean" class="com.w3codebox.Operation">	</bean>
<bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @AfterThrowing -->
     <aop:pointcut id="pointCutAfterThrowing"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:after-throwing method="myadvice" throwing="error" pointcut-ref="pointCutAfterThrowing" />
  </aop:aspect>
</aop:config>
</beans>

ファイル: Test.java

現在実際のメソッドを呼び出すTestクラスを作成しています。

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation op = (Operation) context.getBean("opBean");
		System.out.println("calling validate...");
		try{
			op.validate(19;
		}catch(Exception e){System.out.println(e);}
		System.out.println("calling validate again...");
		try{
		    op.validate(11;
		}catch(Exception e){System.out.println(e);}
	}
}

出力

validate を呼び出す...
投票いただきありがとうございます
validate を再び呼び出す...
追加の懸念
メソッドシグネチャ: void com.w3codebox.Operation.validate(int)
例外は: java.lang.ArithmeticException: Not valid age
after throwing advice の終わり...
java.lang.ArithmeticException: Not valid age