📜  Spring AOP AspectJ Xml配置示例

📅  最后修改于: 2020-12-04 07:55:20             🧑  作者: Mango

Spring AOP AspectJ Xml配置示例

Spring使您可以在xml文件中定义方面,建议和切入点。

在上一页中,我们已经看到了使用批注的aop示例。现在,我们将通过xml配置文件看到相同的示例。

让我们看看用于定义建议的xml元素。

  • aop:before在调用实际的业务逻辑方法之前应用。
  • aop:after在调用实际的业务逻辑方法之后应用。
  • aop:返回后,在调用实际的业务逻辑方法后应用。它可用于截获通知中的返回值。
  • aop:around在调用实际业务逻辑方法之前和之后应用。
  • aop:after-throwing如果实际的业务逻辑方法引发异常,则应用此方法。

要了解aop概念及其优势等,请访问此处。AOP概念教程

1)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();
    }
}

输出量

  1. calling msg...  
  2. additional concern  
  3. msg() method invoked  
  4. calling m...  
  5. additional concern  
  6. m() method invoked  
  7. calling k...  
  8. additional concern  
  9. k() method invoked  

如您所见,在调用msg(),m()和k()方法之前,需要打印其他一些问题。

2)aop:之后的例子

调用实际的业务逻辑方法后,将应用忠于建议的AspectJ。它可以用来维护日志,安全性,通知等。

在这里,我们假设Operation.javaTrackOperation.javaTest.java文件与aop:before示例中给出的相同。

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






    

        

  
     
     
     
  

    

输出量

  1. calling msg...  
  2. msg() method invoked  
  3. additional concern  
  4. calling m...  
  5. m() method invoked  
  6. additional concern  
  7. calling k...  
  8. k() method invoked  
  9. additional concern  

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

3)aop:返回后的示例

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

创建包含业务逻辑的类。

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());
    }
}

输出量

  1. calling m...  
  2. m() method invoked  
  3. additional concern  
  4. Method Signature: int com.javatpoint.Operation.m()  
  5. Result in advice: 2  
  6. end of after returning advice...  
  7. 2  
  8. calling k...  
  9. k() method invoked  
  10. additional concern  
  11. Method Signature: int com.javatpoint.Operation.k()  
  12. Result in advice: 3  
  13. end of after returning advice...  
  14. 3  

您可以看到返回值被打印了两次,一次是由TrackOperation类打印的,第二次是由Test类打印的。

4)aop:周围的例子

围绕建议的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();
    }
}

输出量

  1. Additional Concern Before calling actual method  
  2. msg() is invoked  
  3. Additional Concern After calling actual method  
  4. Additional Concern Before calling actual method  
  5. display() is invoked  
  6. Additional Concern After calling actual method  

您可以看到在调用msg()和display方法之前和之后都会打印出其他问题。

5)aop:掷后示例

通过使用引发建议后的用法,我们可以在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);}
    }
}

输出量

  1. calling validate...  
  2. Thanks for vote  
  3. calling validate again...  
  4. additional concern  
  5. Method Signature: void com.javatpoint.Operation.validate(int)  
  6. Exception is: java.lang.ArithmeticException: Not valid age  
  7. end of after throwing advice...  
  8. java.lang.ArithmeticException: Not valid age