一个简单的Spring的AOP例子(JAVA面向切面编程)

  公司要求分享技术,一个小组九个人,每周一个人,想想讲讲AOP吧,用处也挺大的,果断写了一个小例子,改了改也就成了。这是个简单AOP例子,包括前置通知,后置通知,环绕通知,和目标对象。

wKiom1OhKxih6MkPAAD4ZOTpLLQ666.jpg


目标对象的接口:IStudent.java

package  com.dragon.study;

/** 

 *  @author  ysm

 */ 

public   interface  IStudent  {

    public   void  addStudent(String name);


目标类:StudentImpl.java

package  com.dragon.study.Impl;

import  com.dragon.study.IStudent;

/** 

 *  @author  ysm

 */ 

public   class  StudentImpl  implements  IStudent {

    public   void  addStudent(String name) {

        System.out.println( " 欢迎  " + name + "  加入Spring家庭! " );

    } 

}  


前置通知:BeforeAdvice.java

package  com.dragon.Advice;

import  java.lang.reflect.Method;

import  org.springframework.aop.MethodBeforeAdvice;

/** 

 *  @author  ysm

 */ 

public   class  BeforeAdvice  implements  MethodBeforeAdvice {

    public   void  before(Method method,Object[] args, Object target) throws  Throwable {

        System.out.println( " 这是BeforeAdvice类的before方法. " );

    } 

}


后置通知:AfterAdvice.java

package com.dragon.Advice;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

/**

 * @author ysm

 */

public class AfterAdvice implements AfterReturningAdvice{

    public void afterReturning(Object returnValue ,Method method,Object[] args,Object target) throws Throwable{

        System.out.println("这是AfterAdvice类的afterReturning方法.");

    }

}


环绕通知:CompareInterceptor.java

package com.dragon.Advice;

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

/**

 * @author ysm

 */

public class CompareInterceptor implements MethodInterceptor{

    public Object invoke(MethodInvocation invocation) throws Throwable{

        Object result = null;

        String stu_name = invocation.getArguments()[0].toString();

        if ( stu_name.equals("ysm")){

            //如果学生是ysm时,执行目标方法,

            result= invocation.proceed();

        } else{

            System.out.println("此学生是"+stu_name+"而不是ysm,不批准其加入.");

        }

        return result;

    }

}


配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">


<beans>

<bean id="beforeAdvice" class="com.dragon.Advice.BeforeAdvice"></bean>

<bean id="afterAdvice" class="com.dragon.Advice.AfterAdvice"></bean>

<bean id="compareInterceptor" class="com.dragon.Advice.CompareInterceptor"></bean>

<bean id="studenttarget" class="com.dragon.study.Impl.StudentImpl"></bean>


<bean id="student" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="proxyInterfaces">

<value>com.dragon.study.IStudent</value>

</property>

<property name="interceptorNames">

<list>

<value>beforeAdvice</value>

<value>afterAdvice</value>

<value>compareInterceptor</value>  

</list>

</property>

<property name="target">

<ref bean="studenttarget"/>

</property>

</bean>

</beans>



现在开始写测试类,Test.java

package com;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.dragon.study.IStudent;

/**

 * @author ysm

 */

public class Test {

    /**

     * @param args

     */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        ApplicationContext ctx = new FileSystemXmlApplicationContext("/com/dragon/applicationContext.xml");

        IStudent person = (IStudent)ctx.getBean("student");

        person.addStudent("ysm");

        //person.addStudent("javadragon");

    }

}


你可能感兴趣的:(java,spring,AOP,面向切面编程,前置通知)