A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© liumeng 中级黑马   /  2012-3-5 18:31  /  1544 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Spring完成动态的代理模式:


步骤如下:
1.    写接口类:
public interface Subject {
        public void request();
}
2.    写实现接口的真实主题类:
public class RealSubject implements Subject {
    public void request() {
       System.out.println("真实的主题的实现的方法");
    }
}
3.       再写一个类ProxySubjectBeforeAdvice实现MethodBeforeAdvice接口完成代理方法之前完成的任务:
public class ProxySubjectBeforeAdvice implements MethodBeforeAdvice {
    public void before(Method arg0, Object[] arg1, Object arg2)
           throws Throwable {
           System.out.println("代理之前的任务~~~~~");     
    }
}
4. 写一个ProxySubjectAfterAdvice类实现AfterReturningAdvice接口完成代理之后完成的任务:
public class ProxySubjectAfterAdvice implements AfterReturningAdvice {
    public void afterReturning(Object arg0, Method arg1, Object[] arg2,
           Object arg3) throws Throwable {
       System.out.println("在代理之后完成的任务~~");
    }
}

5.在Spring提供的配置文件applicationContext.xml中进行配置如下:

<!-- 表示实现代理之前的方法的类的实例 -->
    <bean id="before"
   class="org.sqs.spring.aop.demo02.ProxySubjectBeforeAdvice">
    </bean>
    <!-- 表示实现代理之后的方法的类的实例 -->
    <bean id="after" class="org.sqs.spring.aop.demo02.ProxySubjectAfterAdvice"></bean>
    <!--定义一个真实主题类的对象 -->
    <bean id="subject" class="org.sqs.spring.aop.demo02.RealSubject"></bean>
    <!-- 写出Spring中提供的代理类的Bean(一定要注意找准Spring中的那个ProxyFactoryBean类) -->
    <bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
          <!-- 说明代理的接口是谁 -->
          <property name="proxyInterfaces">
              <!-- 值表示那个真实的类实现的接口Subject --             <value>org.sqs.spring.aop.demo02.Subject</value>
          </property>
          <!-- 加入一个目标属性表示所代理的真实类-->
          <property name="target">
              <!-- 参考subject(真实的主题类的实例) -->
              <ref bean="subject"/>
          </property>
          <!-- 写入拦截器属性 -->
          <property name="interceptorNames">
                <!-- 注入拦截器的集合 -->
             <list>
                    <!-- 表示调用刚才定义的ProxySubjectBeforeAdvice的实例中的before()方法 -->
                    <!-- value中间的before其实是刚才ProxySubjectBeforeAdvice的Bean的id-->
                   <value>before</value>
                     <!-- 加入代理之后完成任务的拦截器 -->
                   <value>after</value>
             </list>
          </property>
    </bean>




6.编写测试类:

public class TestDemo {

      public static void main(String args[]){

      ApplicationContext context = null;

      context = new ClassPathXmlApplicationContext("applicationContext.xml");

      //得到代理类的Bean(是Spring中提供的(已经在配置文件中实现了Subject接口))

      Subject sub = (Subject) context.getBean("proxy");

      sub.request();//实现真实的方法(同时代理也完成了!)

      }

}

最后打印的结果是:

  代理之前的任务~~~~~

真实的主题的实现的方法

在代理之后完成的任务~

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马