مشخصات مقاله
-
538
-
0.0
-
1926
-
0
-
0
آموزش String 1.2 AOP DTD-Java Spring
Spring1.2 AOP DTD
مثال AOP در اسپرینگ
مثال هایی از پیاده سازی AOP در اسپرینگ1.2 سبک قدیمی مبتنی بر dtd ارائه شده است (Spring1.2 old style AOP (dtd based)). توصیه می شود تا از اسپرینگ AOP همراه با aspectJ که در ادامه یاد خواهیم گرفت، استفاده کنید، اگرچه در اسپرینگ 3 پشتیبانی می شود. پیاده سازی AOP اسپرینگ1.2 سبک قدیمی از 4 نوع توصیه پشتیبانی می کند.
Before advice :
قبل از فراخوانی متد اصلی (actual method) اجرا می شود.
After advice :
پس از فراخوانی متد اصلی اجرا می شود. اگر متد یک مقدار را باز گرداند، پس از بازگرداندن مقدار اجرا می شود.
Around advice :
قبل و بعد از فراخوانی متد اصلی اجرا می شود.
Throws advice :
در صورت پرتاب استثنا(بروز خطا) توسط متد اصلی، اجرا می شود.
درک سلسله مراتب واسط های توصیه
با توجه به شکل زیر سلسله مراتب توصیه را بررسی خواهیم کرد.
همگی آنها واسط هایی(interfaces) در AOP هستند.
واسط MethodBeforeAdvice واسط BeforeAdvice را توسعه می دهد.
واسط AfterReturningAdvice واسط AfterAdvice را توسعه می دهد.
واسط ThrowsAdvice واسط AfterAdvice را توسعه می دهد.
واسط MethodInterceptor واسط Interceptor را توسعه می دهد و در around advice مورد استفاده قرار می گیرد.
1- مثال MethodBeforeAdvice
کلاسی ایجاد کنید که شامل منطق اصلی تجارت (actual business logic) باشد.
File: A.java
package com.javatpoint;
public class A {
public void m(){System.out.println("actual business logic");}
}
حال یک کلاس مشاور(advisor) ایجاد کنید که واسط MethodBeforeAdvice را پیاده سازی کند.
File: BeforeAdvisor.java
package com.javatpoint;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class BeforeAdvisor implements MethodBeforeAdvice{
@Override
public void before(Method method, Object[] args, Object target)throws Throwable {
System.out.println("additional concern before actual logic");
}
}
در فایل xml سه bean برای کلاس A، کلاس مشاور و کلاس ProxyFactoryBean ایجاد کنید.
File: applicationContext.xml
< ?xml version="1.0" encoding="UTF-8" ?>
< beans 3. xmlns="http://www.springframework.org/schema/beans"
4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. xmlns:p="http://www.springframework.org/schema/p"
6. xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
< bean id="obj" class="com.javatpoint.A">< /bean>
< bean id="ba" class="com.javatpoint.BeforeAdvisor">< /bean>
< bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
< property name="target" ref="obj">< /property>
< property name="interceptorNames">
< list>
< value>ba< /value>
< /list>
< /property>
< /bean>
< /beans>
درک کلاس ProxyFactoryBean
کلاس ProxyFactoryBean توسط فریمورک اسپرینگ ارائه شده است که شامل دو مشخصه هدف(target) و نام جداکننده ها(interceptorNames) است. نمونه(instance) کلاس A به عنوان شی هدف و نمونه کلاس مشاور به عنوان رهگیر(interceptor) در نظر گرفته می شود. شما باید شی مشاور را به عنوان شی لیست همانند فایل xml در بالا پاس دهید. کلاس ProxyFactoryBean همانند کد زیر نوشته می شود.
public class ProxyFactoryBean{
private Object target;
private List interceptorNames;
//getters and setters
}
حال متد اصلی را فراخوانی می کنیم.
File: Test.java
package com.javatpoint;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
Resource r=new ClassPathResource("applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(r);
A a=factory.getBean("proxy",A.class);
a.m();
}
}
خروجی :
1. additional concern before actual logic
2. actual business logic
چاپ اطلاعات اضافی درMethodBeforeAdvice
می توانیم اطلاعات اضافی مانند نام متد، آرگومان متد، شی هدف، نام کلاس شی هدف، کلاس پروکسی و غیره را چاپ کنیم. تنها احتیاج به تغییر دو کلاس BeforeAdvisor.java و Test.java دارید.
File: BeforeAdvisor.java
package com.javatpoint;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class BeforeAdvisor implements MethodBeforeAdvice{
@Override
public void before(Method method, Object[] args, Object target)throws Throwable {
System.out.println("additional concern before actual logic");
System.out.println("method info:"+method.getName()+" "+method.getModifiers());
System.out.println("argument info:");
for(Object arg:args)
System.out.println(arg);
System.out.println("target Object:"+target);
System.out.println("target object class name: "+target.getClass().getName());
}
}
File: Test.java
package com.javatpoint;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
Resource r=new ClassPathResource("applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(r);
A a=factory.getBean("proxy",A.class);
System.out.println("proxy class name: "+a.getClass().getName());
a.m();
}
}
خروجی :
1. proxy class name: com.javatpoint.A$$EnhancerByCGLIB$$409872b1
2. additional concern before actual logic
3. method info:m 1
4. argument info:
5. target Object:com.javatpoint.A@11dba45
6. target object class name: com.javatpoint.A
7. actual business logic
2- مثال AfterReturningAdvice
همانند مثال قبل، کلاسی ایجاد کنید که شامل منطق اصلی تجارت(actual business logic) باشد.
File: A.java
حال یک کلاس مشاور ایجاد کنید که واسط AfterReturningAdvice را پیاده سازی کند.
File: AfterAdvisor.java
package com.javatpoint;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class AfterAdvisor implements AfterReturningAdvice{
@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
System.out.println("additional concern after returning advice");
}
}
همانند مثال قبل فایل xml را ایجاد کنید. در اینجا تنها نیاز به تغییر کلاس مشاور دارید.
File: applicationContext.xml
< ?xml version="1.0" encoding="UTF-8" ?>
< beans 3. xmlns="http://www.springframework.org/schema/beans"
4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. xmlns:p="http://www.springframework.org/schema/p"
6. xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
< bean id="obj" class="com.javatpoint.A">< /bean>
< bean id="ba" class="com.javatpoint.AfterAdvisor">< /bean>
< bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
< property name="target" ref="obj">< /property>
< property name="interceptorNames">
< list>
< value>ba< /value>
< /list>
< /property>
< /bean>
< /beans>
فایل test.java همانند مثال قبل.
خروجی :
1. actual business logic
2. additional concern after returning advice
3- مثال MethodInterceptor (AroundAdvice)
کلاسی شامل منطق اصلی تجارت(actual business logic) ایجاد کنید. فایل A.java همانند مثال قبل. حال یک کلاس مشاور که واسط MethodInterceptor را پیاده سازی می کند، ایجاد کنید.
File: AroundAdvisor.java
package com.javatpoint;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class AroundAdvisor implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation mi) throws Throwable {
Object obj;
System.out.println("additional concern before actual logic");
obj=mi.proceed();
System.out.println("additional concern after actual logic");
return obj;
}
}
همانند مثال قبل فایل xml را ایجاد کنید. در اینجا تنها نیاز به تغییر کلاس مشاور دارید.
File: applicationContext.xml
< ?xml version="1.0" encoding="UTF-8" ?>
< beans 3. xmlns="http://www.springframework.org/schema/beans"
4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. xmlns:p="http://www.springframework.org/schema/p"
6. xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
< bean id="obj" class="com.javatpoint.A">< /bean>
< bean id="ba" class="com.javatpoint.AroundAdvisor">< /bean>
< bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
< property name="target" ref="obj">< /property>
< property name="interceptorNames">
< list>
< value>ba< /value>
< /list>
< /property>
< /bean>
< /beans>
فایل test.java همانند مثال قبل.
خروجی :
1. additional concern before actual logic
2. actual business logic
3. additional concern after actual logic
4- مثال ThrowsAdvice
کلاسی شامل منطق اصلی تجارت(actual business logic) ایجاد کنید.
File: Validator.java
package com.javatpoint;
public class Validator {
public void validate(int age)throws Exception{
if(age<18){ throw new ArithmeticException("Not Valid Age");
}
else{
System.out.println("vote confirmed");
}
}
}
حال یک کلاس مشاور که واسط ThrowsAdvice را پیاده سازی می کند، ایجاد کنید.
File: ThrowsAdvisor.java
package com.javatpoint;
import org.springframework.aop.ThrowsAdvice;
public class ThrowsAdvisor implements ThrowsAdvice{
public void afterThrowing(Exception ex){
System.out.println("additional concern if exception occurs");
}
}
همانند مثال قبل فایل xml را ایجاد کنید. در اینجا تنها نیاز به تغییر کلاس Validator و کلاس مشاور دارید.
File: applicationContext.xml
< ?xml version="1.0" encoding="UTF-8" ?>
< beans 3. xmlns="http://www.springframework.org/schema/beans"
4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. xmlns:p="http://www.springframework.org/schema/p"
6. xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
< bean id="obj" class="com.javatpoint.Validator">< /bean>
< bean id="ba" class="com.javatpoint.ThrowsAdvisor">< /bean>
< bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
< property name="target" ref="obj">< /property>
< property name="interceptorNames">
< list>
< value>ba< /value>
< /list>
< /property>
< /bean>
< /beans>
File: Test.java
package com.javatpoint;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
Resource r=new ClassPathResource("applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(r);
Validator v=factory.getBean("proxy",Validator.class);
try{
v.validate(12);
}catch(Exception e){e.printStackTrace();}
}
}
خروجی :
java.lang.ArithmeticException: Not Valid Age
additional concern if exception occurs
at com.javatpoint.Validator.validate(Validator.java:7)
at com.javatpoint.Validator$$FastClassByCGLIB$$562915cf.invoke()
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invoke
Joinpoint(Cglib2AopProxy.java:692)
at org.springframework.aop.framework.ReflectiveMethodInvocation.
proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.
invoke(ThrowsAdviceInterceptor.java:124)
at org.springframework.aop.framework.ReflectiveMethodInvocation.
proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.
intercept(Cglib2AopProxy.java:625)
at com.javatpoint.Validator$$EnhancerByCGLIB$$4230ed28.validate()
at com.javatpoint.Test.main(Test.java:15)