Spring AOP AspectJ Xml配置示例

Spring使您能夠在xml文件中定義方面,建議和切入點(diǎn)。

在上一頁(yè)中,我們已經(jīng)看到了使用批注的aop示例?,F(xiàn)在,我們將通過(guò)xml配置文件看到相同的示例。

讓我們看看用于定義建議的xml元素。

aop: before 在調(diào)用實(shí)際的業(yè)務(wù)邏輯方法之前應(yīng)用。 aop: after 在調(diào)用實(shí)際的業(yè)務(wù)邏輯方法之后應(yīng)用。 aop: 返回后在調(diào)用實(shí)際的業(yè)務(wù)邏輯方法后應(yīng)用??捎糜跀r截通知中的返回值。 aop: around 在調(diào)用實(shí)際的業(yè)務(wù)邏輯方法之前和之后都將應(yīng)用。 aop: 投擲后如果實(shí)際的業(yè)務(wù)邏輯方法拋出異常,則將其應(yīng)用。
注意: 要了解aop概念及其優(yōu)勢(shì)等,請(qǐng)?jiān)L問(wèn)此處。AOP概念教程

1、aop: before

在實(shí)際業(yè)務(wù)邏輯方法之前應(yīng)用"先行AspectJ建議"。您可以在此處執(zhí)行任何操作,例如轉(zhuǎn)換,身份驗(yàn)證等。

創(chuàng)建一個(gè)包含實(shí)際業(yè)務(wù)邏輯的類(lèi)。

文件: Operation.java
package com.nhooo;
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;}
}

現(xiàn)在,創(chuàng)建包含在建議之前的方面類(lèi)。

文件: TrackOperation.java

package com.nhooo;
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());
	}
}

現(xiàn)在創(chuàng)建定義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.nhooo.Operation">	</bean>
<bean id="trackAspect" class="com.nhooo.TrackOperation"></bean>
		
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @Before -->
     <aop:pointcut id="pointCutBefore"	expression="execution(* com.nhooo.Operation.*(..))" />
     <aop:before method="myadvice" pointcut-ref="pointCutBefore" />
  </aop:aspect>
</aop:config>
	
</beans>

現(xiàn)在,讓我們稱(chēng)為實(shí)際方法。

文件: Test.java

package com.nhooo;
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...
additional concern
msg() method invoked
calling m...
additional concern
m() method invoked
calling k...
additional concern
k() method invoked

如您所見(jiàn),在調(diào)用msg(),m()和k()方法之前,還會(huì)打印出其他問(wèn)題。


2、aop: 之后的示例

在調(diào)用實(shí)際的業(yè)務(wù)邏輯方法之后,應(yīng)用了通知之后的AspectJ。它可用于維護(hù)日志,安全性,通知等。

在這里,我們假設(shè) Operation.java TrackOperation.java Test.java 文件與aop: 中的示例相同。

現(xiàn)在創(chuàng)建定義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.nhooo.Operation">	</bean>
<bean id="trackAspect" class="com.nhooo.TrackOperation"></bean>
		
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @After -->
     <aop:pointcut id="pointCutAfter"	expression="execution(* com.nhooo.Operation.*(..))" />
     <aop:after method="myadvice" pointcut-ref="pointCutAfter" />
  </aop:aspect>
</aop:config>
	
</beans>

輸出

calling msg...
msg() method invoked
additional concern
calling m...
m() method invoked
additional concern
calling k...
k() method invoked
additional concern

您可以看到在調(diào)用msg(),m()和k()方法之后,還會(huì)出現(xiàn)其他問(wèn)題。


3、aop: 返回后的示例

通過(guò)在返回建議后使用,我們可以在建議中獲得結(jié)果。

創(chuàng)建

文件: Operation.java

package com.nhooo;
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;}
}

創(chuàng)建返回建議后包含的方面類(lèi)。

文件: TrackOperation.java

package com.nhooo;
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.nhooo.Operation">	</bean>
	
<bean id="trackAspect" class="com.nhooo.TrackOperation"></bean>
		
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @AfterReturning -->
     <aop:pointcut id="pointCutAfterReturning"	expression="execution(* com.nhooo.Operation.*(..))" />
     <aop:after-returning method="myadvice" returning="result" pointcut-ref="pointCutAfterReturning" />
  </aop:aspect>
</aop:config>
	
</beans>

文件: Test.java

現(xiàn)在創(chuàng)建調(diào)用實(shí)際方法的Test類(lèi)。

package com.nhooo;
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
additional concern
Method Signature: int com.nhooo.Operation.m()
Result in advice: 2
end of after returning advice...
2
calling k...
k() method invoked
additional concern
Method Signature: int com.nhooo.Operation.k()
Result in advice: 3
end of after returning advice...
3

您可以看到返回值被打印兩次,一次是由TrackOperation類(lèi)打印,第二次是Test類(lèi)。


4、aop: around

AspectJ周?chē)ㄗh是在調(diào)用實(shí)際的業(yè)務(wù)邏輯方法之前和之后應(yīng)用的。

創(chuàng)建一個(gè)類(lèi)

文件: Operation.java

package com.nhooo;
public  class Operation{
	public void msg(){System.out.println("msg() is invoked");}
	public void display(){System.out.println("display() is invoked");}
}

創(chuàng)建包含圍繞建議的方面類(lèi)。

您需要在advice方法中傳遞 PreceedingJoinPoint 引用,以便我們可以通過(guò)調(diào)用proceed來(lái)進(jìn)行請(qǐng)求()方法。

文件: TrackOperation.java

package com.nhooo;
import org.aspectj.lang.ProceedingJoinPoint;
public class TrackOperation
{
	public Object myadvice(ProceedingJoinPoint pjp) throws Throwable 
	{
		System.out.println("Additional Concern Before calling actual method");
		Object obj=pjp.proceed();
		System.out.println("Additional Concern After calling actual method");
		return 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.nhooo.Operation">	</bean>
	
<bean id="trackAspect" class="com.nhooo.TrackOperation"></bean>
		
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @Around -->
     <aop:pointcut id="pointCutAround"	expression="execution(* com.nhooo.Operation.*(..))" />
     <aop:around method="myadvice" pointcut-ref="pointCutAround" />
  </aop:aspect>
</aop:config>
	
</beans>

文件: Test.java

現(xiàn)在創(chuàng)建調(diào)用實(shí)際方法的Test類(lèi)。

package com.nhooo;
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();
	}
}

輸出

Additional Concern Before calling actual method
msg() is invoked
Additional Concern After calling actual method
Additional Concern Before calling actual method
display() is invoked
Additional Concern After calling actual method

您可以看到在調(diào)用msg()和顯示方法之前和之后,還會(huì)打印出其他問(wèn)題。


5、aop: after-throwing

通過(guò)使用擲后建議,我們可以在TrackOperation類(lèi)中打印異常。讓我們看一下AspectJ AfterThrowing建議的示例。

創(chuàng)建包含業(yè)務(wù)邏輯的類(lèi)。

文件: Operation.java

package com.nhooo;
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");
	}
	}
	
}

創(chuàng)建引發(fā)建議后包含的方面類(lèi)。

在這里,我們還需要傳遞Throwable引用,以便我們可以在此處攔截異常。

文件: TrackOperation.java

package com.nhooo;
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.nhooo.Operation">	</bean>
<bean id="trackAspect" class="com.nhooo.TrackOperation"></bean>
		
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @AfterThrowing -->
     <aop:pointcut id="pointCutAfterThrowing"	expression="execution(* com.nhooo.Operation.*(..))" />
     <aop:after-throwing method="myadvice" throwing="error" pointcut-ref="pointCutAfterThrowing" />
  </aop:aspect>
</aop:config>
	
</beans>

文件: Test.java

現(xiàn)在創(chuàng)建調(diào)用實(shí)際方法的Test類(lèi)。

package com.nhooo;
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);}
	}
}

輸出

calling validate...
Thanks for vote
calling validate again...
additional concern
Method Signature: void com.nhooo.Operation.validate(int)
Exception is: java.lang.ArithmeticException: Not valid age
end of after throwing advice...
java.lang.ArithmeticException: Not valid age

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清