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

آموزش 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)   
1398/12/19 1926 538
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

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