کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش SP AspectJ XML-Java Spring

SP AspectJ XML

مثال پیکربندی AOP AspectJ Xml در اسپرینگ

اسپرینگ به شما این امکان را می دهد تا بتوانید جنبه ها(aspects)، توصیه ها(advices) و pointcut ها را در فایل xml تعریف کنید. در بخش قبل مثال هایی از AOP با استفاده از نمادگذاری(annotation) را دیدیم. حال همان مثال ها را با استفاده از فایل پیکربندی xml بررسی می کنیم. عناصر xml ای که برای تعریف توصیه مورد استفاده قرار می گیرند را با هم می بینیم.

  • aop:before قبل از فراخوانی متد actual business logic اعمال می شود.
  • aop:after بعد از فراخوانی متد actual business logic اعمال می شود.
  • aop:after-returning بعد از فراخوانی متد actual business logic اعمال می شود و نیز می توان از آن برای رهگیری(intercept) مقدار بازگشتی در توصیه استفاده کرد.
  • aop:around قبل و بعد از فراخوانی متد actual business logic اعمال می شود.
  • aop:after-throwing در صورتی که متد actual business logic استثنا پرتاب کند، اعمال می شود.

1- مثال aop:before

AspectJ Before Advice قبل از متد actual business logic اعمال می شود. در اینجا هر عملیاتی از جمله تبدیل(conversion)، احراز هویت(authentication) و غیره را می توانید اجرا کنید. یک کلاس در بردارنده actual business logic ایجاد کنید.

File: Operation.java

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

حال کلاس جنبه(aspect class) شامل before advice ایجاد کنید.

File: TrackOperation.java

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

حال فایل applicationContext.xmlکه bean ها را تعریف می کند ایجاد کنید.

File: applicationContext.xml

< ?xml version="1.0" encoding="UTF-8" ?>
  
< beans xmlns="http://www.springframework.org/schema/beans"
         3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             4. xmlns:aop="http://www.springframework.org/schema/aop"
             5. 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.javatpoint.Operation">   < /bean>  
< bean id="trackAspect" class="com.javatpoint.TrackOperation">< /bean>  
           
< aop:config>  
   < aop:aspect id="myaspect" ref="trackAspect">  
        
      < aop:pointcut id="pointCutBefore" expression="execution(* com.javatpoint.Operation.*(..))" />
  
      < aop:before method="myadvice" pointcut-ref="pointCutBefore" />
  
   < /aop:aspect>  
< /aop:config>  
       
< /beans> 

اکنون متد actual را فراخوانی کنید.

File: Test.java

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


همانطور که می بینید، دغدغه اضافی(additional concern) قبل از فراخوانی متدهای msg()، m() و k() چاپ می شود.


2- مثال aop:after

AspectJ after advice پس از فراخوانی متدهای actual business logic اعمال می شود. علاوه بر آن، برای نگهداری از وقایع(maintain log)، امنیت، اعلانات و غیره مورد استفاده قرار می گیرد. در اینجا فرض بر این است که فایل های Operation.java ، TrackOperation.java و Test.java مشابه مثال aop:before است. حال فایل applicationContext.xmlکه bean ها را تعریف می کند ایجاد کنید.

File: applicationContext.xml

< ?xml version="1.0" encoding="UTF-8" ?>
  
< beans xmlns="http://www.springframework.org/schema/beans"
          3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          4. xmlns:aop="http://www.springframework.org/schema/aop"
          5. 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.javatpoint.Operation">   < /bean>  
< bean id="trackAspect" class="com.javatpoint.TrackOperation">< /bean>  
           
< aop:config>  
   < aop:aspect id="myaspect" ref="trackAspect">  
        
      < aop:pointcut id="pointCutAfter" expression="execution(* com.javatpoint.Operation.*(..))" />
  
      < aop:after method="myadvice" pointcut-ref="pointCutAfter" />
  
   < /aop:aspect>  
< /aop:config>  
       
< /beans>     

خروجی :

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:after-returning

با استفاده ازبا استفاده از after returning advice، می توان نتیجه را داخل توصیه گرفت. یک کلاس شامل business logic ایجاد کنید.

File: Operation.java

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

یک کلاس جنبه شامل after returning advice ایجاد کنید.

File: TrackOperation.java

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

File: applicationContext.xml

< ?xml version="1.0" encoding="UTF-8" ?>
  
< beans xmlns="http://www.springframework.org/schema/beans"
          3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          4. xmlns:aop="http://www.springframework.org/schema/aop"
          5. 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.javatpoint.Operation">   < /bean>  
       
< bean id="trackAspect" class="com.javatpoint.TrackOperation">< /bean>  
           
< aop:config>  
   < aop:aspect id="myaspect" ref="trackAspect">  
        
      < aop:pointcut id="pointCutAfterReturning" expression="execution(* com.javatpoint.Operation.*(..))" />
  
      < aop:after-returning method="myadvice" returning="result" pointcut-ref="pointCutAfterReturning" />
  
   < /aop:aspect>  
< /aop:config>  
       
< /beans>   

حال یک کلاس test که متدهای actual را فراخوانی می کند ایجاد کنید.

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:around

AspectJ around advice قبل و بعد از فراخوانی متدهای actual business logic اعمال می شود. یک کلاس شامل actual business logic ایجاد کنید.

File: Operation.java

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

یک کلاس جنبه شامل around advice ایجاد کنید. برای این که بتوان درخواست را با فراخوانی متد proceed() پیگیری کرد، باید مرجع PreceedingJoinPoint را در متد advice پاس دهید.

File: TrackOperation.java

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

File: applicationContext.xml

< ?xml version="1.0" encoding="UTF-8" ?>
  
< beans xmlns="http://www.springframework.org/schema/beans"
          3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          4. xmlns:aop="http://www.springframework.org/schema/aop"
          5. 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.javatpoint.Operation">   < /bean>  
       
< bean id="trackAspect" class="com.javatpoint.TrackOperation">< /bean>  
           
< aop:config>  
   < aop:aspect id="myaspect" ref="trackAspect">  
        
      < aop:pointcut id="pointCutAround" expression="execution(* com.javatpoint.Operation.*(..))" />
  
      < aop:around method="myadvice" pointcut-ref="pointCutAround" />
  
   < /aop:aspect>  
< /aop:config>  
       
< /beans>      

حال یک کلاس test که متدهای actual را فراخوانی می کند ایجاد کنید.

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:after-throwing

با استفاده از after throwing advice می توانیم استثنا را در کلاس TrackOperation چاپ کنیم. مثالی از AspectJ AfterThrowing advice را بررسی می کنیم. کلاسی شامل business logic ایجاد کنید.

File: Operation.java

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

یک کلاس جنبه شامل after throwing advice ایجاد کنید. در اینجا برای اینکه بتوانیم استثنا را رهگیری کنیم، باید مرجع قابل پرتاب(throwable) را نیز پاس بدهیم.

File: TrackOperation.java

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

File: applicationContext.xml

< ?xml version="1.0" encoding="UTF-8" ?>
  
< beans xmlns="http://www.springframework.org/schema/beans"
          3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          4. xmlns:aop="http://www.springframework.org/schema/aop"
          5. 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.javatpoint.Operation">   < /bean>  
< bean id="trackAspect" class="com.javatpoint.TrackOperation">< /bean>  
           
< aop:config>  
   < aop:aspect id="myaspect" ref="trackAspect">  
        
      < aop:pointcut id="pointCutAfterThrowing" expression="execution(* com.javatpoint.Operation.*(..))" />
  
      < aop:after-throwing method="myadvice" throwing="error" pointcut-ref="pointCutAfterThrowing" />
  
   < /aop:aspect>  
< /aop:config>  
       
< /beans>   

حال یک کلاس test که متدهای actual را فراخوانی می کند ایجاد کنید.

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


1398/12/19 1785 627
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...