مشخصات مقاله
-
627
-
0.0
-
1785
-
0
-
0
آموزش 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