2008年9月16日星期二

Spring代理 之 ProxyFactoryBean

  1. package home.dong.aop;
  2. import org.springframework.aop.framework.ProxyFactoryBean;
  3. import org.springframework.beans.factory.BeanFactory;
  4. import org.springframework.beans.factory.xml.XmlBeanFactory;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. import org.springframework.core.io.ClassPathResource;
  8. import home.dong.advice.MyMethodBeforeAdvice;
  9. import home.dong.impl.Lion;
  10. import home.dong.impl.Tiger;
  11. import home.dong.inter.Animal;
  12. public class Spring_AOP {
  13.     public void proxy_A_Animal() throws ClassNotFoundException {
  14.         Lion lion = new Lion();
  15.         ProxyFactoryBean pfb = new ProxyFactoryBean();
  16.         pfb.setProxyTargetClass(true);
  17.         // 为true时 指定代理的是 类
  18.         // 而不是借口,此时使用的是CGLIB来实现代理,可以看到被代理的实体类的构造方法被调用*两次*
  19.         // 默认值为false
  20.         // pfb.setProxyInterfaces(new Class[]{Animal.class});
  21.         // 指定代理的是借口而非类,此时使用的是java来实现代理(java 代理必须指定借口)
  22.         /**
  23.          * 以上两个方法 setProxyTargetClass() setProxyInterfaces()
  24.          * 如果同时指定(既-----指定直接代理类,而又指定了代理的借口),则spring会优先选择java代理方式
  25.          * 
  26.          * 如果同时未指定,则spring会根据被代理类是否实现了某个借口而自动选择使用java代理还是CBLIB代理. 注意:
  27.          * 如果被代理对象实现了借口
  28.          * 既spring选择java代理,则在通过代理工厂得到对象实例时必须将得到的对象转换成被代理对象的借口类型,否则会转型错误抛出
  29.          * ClassCastException异常.
  30.          * 如果被代理对象没有实现任何借口,既spring选择CGLIB代理,则在通过代理工厂得到对象实例时必须将得到的对象直接转换成被代理对象的类型
  31.          * 
  32.          */
  33.         pfb.setTarget(lion);
  34.         pfb.addAdvice(new MyMethodBeforeAdvice());
  35.         // 使用java代理必须使用其借口来得到对象,否则会转型出错
  36.         // Animal obj = (Animal) pfb.getObject();
  37.         Lion ln = (Lion) pfb.getObject();
  38.         String str = ln._Fight("Tiger");
  39.         System.out.println(str);
  40.     }
  41.     public static void main(String[] args) throws ClassNotFoundException {
  42.          Spring_AOP aop = new Spring_AOP();
  43.          aop.proxy_A_Animal();
  44.     }
  45. }

标签:

0 条评论:

发表评论

订阅 博文评论 [Atom]

<< 主页