📅  最后修改于: 2020-12-04 07:55:20             🧑  作者: Mango
Spring使您可以在xml文件中定义方面,建议和切入点。
在上一页中,我们已经看到了使用批注的aop示例。现在,我们将通过xml配置文件看到相同的示例。
让我们看看用于定义建议的xml元素。
要了解aop概念及其优势等,请访问此处。AOP概念教程
在实际业务逻辑方法之前应用AspectJ Before Advice。您可以在此处执行任何操作,例如转换,身份验证等。
创建一个包含实际业务逻辑的类。
package com.javatpoint;
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;}
}
现在,创建包含在建议之前的方面类。
package com.javatpoint;
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文件。
现在,让我们调用实际方法。
package com.javatpoint;
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
如您所见,在调用msg(),m()和k()方法之前,需要打印其他一些问题。
调用实际的业务逻辑方法后,将应用忠于建议的AspectJ。它可以用来维护日志,安全性,通知等。
在这里,我们假设Operation.java , TrackOperation.java和Test.java文件与aop:before示例中给出的相同。
现在创建定义bean的applicationContext.xml文件。
- calling msg...
- msg() method invoked
- additional concern
- calling m...
- m() method invoked
- additional concern
- calling k...
- k() method invoked
- additional concern
您可以看到在调用msg(),m()和k()方法之后,还会显示其他问题。
通过在返回建议后使用,我们可以在建议中获得结果。
创建包含业务逻辑的类。
package com.javatpoint;
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;}
}
返回建议后,创建包含的方面类。
package com.javatpoint;
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...");
}
}
现在,创建调用实际方法的Test类。
package com.javatpoint;
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.javatpoint.Operation.m()
- Result in advice: 2
- end of after returning advice...
- 2
- calling k...
- k() method invoked
- additional concern
- Method Signature: int com.javatpoint.Operation.k()
- Result in advice: 3
- end of after returning advice...
- 3
您可以看到返回值被打印了两次,一次是由TrackOperation类打印的,第二次是由Test类打印的。
围绕建议的AspectJ在调用实际的业务逻辑方法之前和之后都会应用。
创建一个包含实际业务逻辑的类。
package com.javatpoint;
public class Operation{
public void msg(){System.out.println("msg() is invoked");}
public void display(){System.out.println("display() is invoked");}
}
创建包含建议周围的方面类。
您需要在advice方法中传递PreceedingJoinPoint引用,以便我们可以通过调用progress()方法来进行请求。
package com.javatpoint;
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;
}
}
现在,创建调用实际方法的Test类。
package com.javatpoint;
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
您可以看到在调用msg()和display方法之前和之后都会打印出其他问题。
通过使用引发建议后的用法,我们可以在TrackOperation类中print异常。让我们看一下AspectJ AfterThrowing建议的示例。
创建包含业务逻辑的类。
package com.javatpoint;
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引用,以便我们可以在此处拦截异常。
package com.javatpoint;
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...");
}
}
现在,创建调用实际方法的Test类。
package com.javatpoint;
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.javatpoint.Operation.validate(int)
- Exception is: java.lang.ArithmeticException: Not valid age
- end of after throwing advice...
- java.lang.ArithmeticException: Not valid age