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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 孙百鑫 于 2013-5-15 21:01 编辑

  1. ************************配置文件****************************
  2. #xxx=java.util.ArrayList
  3. xxx=cn.itcast.day03.aopframework.ProxyFactoryBean
  4. xxx.advice=cn.itcast.day03.MyAdvice
  5. xxx.target=java.util.ArrayList
  6. ************************22222*****************************
  7. package cn.itcast.day03.aopframework;

  8. import java.io.InputStream;
  9. import java.util.Collection;

  10. public class AopFrameworkTest {

  11.         /**
  12.          * @param args
  13.          */
  14.         public static void main(String[] args) throws Exception {
  15.                 // TODO Auto-generated method stub
  16.                
  17.                 //用相对路径getResourceAsStream来加载配置文件
  18.                 InputStream ips = AopFrameworkTest.class.getResourceAsStream("config.properties");
  19.                
  20.                 //将ips流输出到BeanFactory类的构造方法中.并往getBean函数内传递XXX的键.
  21.                 Object bean = new BeanFactory(ips).getBean("xxx");
  22.                
  23.                 //打印返回的值的名字.
  24.                 System.out.println(bean.getClass().getName());
  25.                 ((Collection)bean).clear();
  26.         }

  27. }
  28. ********************333333333**********************************
  29. package cn.itcast.day03.aopframework;

  30. import java.io.IOException;
  31. import java.io.InputStream;
  32. import java.util.Properties;
  33. import cn.itcast.day03.Advice;


  34. public class BeanFactory {
  35.         
  36.         //建立Properties对象用于接收传进来的流.
  37.         Properties props = new Properties();
  38.         public BeanFactory(InputStream ips){
  39.                 try {
  40.                         //将AopFrameworkTest流中的数据传入到Properties中
  41.                         props.load(ips);
  42.                 } catch (IOException e) {
  43.                         // TODO Auto-generated catch block
  44.                         e.printStackTrace();
  45.                 }
  46.         }
  47.         
  48.         //将XXX的键传入到getBean中
  49.         public Object getBean(String name){
  50.                
  51.                 //获取XXX中的值
  52.                 String className = props.getProperty(name);
  53.                
  54.                 //在try外边建立引用
  55.                 Object bean = null;
  56.                 try {
  57.                         
  58.                         //用Class.forName获取XXX中的字节码文件并用newInstance创建实例对象
  59.                         Class clazz = Class.forName(className);
  60.                         bean = clazz.newInstance();
  61.                 } catch (Exception e) {
  62.                         // TODO Auto-generated catch block
  63.                         e.printStackTrace();
  64.                 }
  65.                
  66.                 //对XXX中的值进行判断.是否实例化ProxyFactoryBean,如果不是直接返回到AopFrameworkTest并打印
  67.                 if(bean instanceof ProxyFactoryBean){
  68.                         
  69.                         //try外部建立引用
  70.                         Object proxy = null;
  71.                         
  72.                         //已知XXX的值肯定是ProxyFactoryBean的实力对象了.直接强转过来.
  73.                         ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;
  74.                         try {
  75.                                 
  76.                                 //????????????????????????????????????????????????????没理解透这句话(props.getProperty(name + ".advice")).newInstance();
  77.                                 //??????????????????????????????????????????????????????????????特别是name + ".advice"
  78.                                 Advice advice = (Advice)Class.forName(props.getProperty(name + ".advice")).newInstance();
  79.                                 Object target = Class.forName(props.getProperty(name + ".target")).newInstance();
  80.                                 
  81.                                 //这是proxyFactoryBean中的advice和target,
  82.                                 proxyFactoryBean.setAdvice(advice);
  83.                                 proxyFactoryBean.setTarget(target);
  84.                                 
  85.                                 //使用代理.
  86.                                 proxy = proxyFactoryBean.getProxy();
  87.                         } catch (Exception e) {
  88.                                 // TODO Auto-generated catch block
  89.                                 e.printStackTrace();
  90.                         }
  91.                         //返回代理
  92.                         return proxy;
  93.                 }
  94.                 return bean;
  95.         }
  96. }
  97. ****************************3333333333*****************************
  98. package cn.itcast.day03.aopframework;

  99. import java.lang.reflect.InvocationHandler;
  100. import java.lang.reflect.Method;
  101. import java.lang.reflect.Proxy;

  102. import cn.itcast.day03.Advice;

  103. public class ProxyFactoryBean {

  104.         //私有化
  105.         private Advice advice;
  106.         private Object target;
  107.         public Object getProxy() {
  108.                 //使用Proxy代理类的静态方法newProxyInstance.并实现代理类的三个参数
  109.                 Object proxy3 = Proxy.newProxyInstance(
  110.                                 
  111.                                 //target的类加载器
  112.                                 target.getClass().getClassLoader(),
  113.                                 
  114.                                 //new Class[]{Collection.class},
  115.                                 //target的接口
  116.                                 target.getClass().getInterfaces(),
  117.                                 
  118.                                 //InvocationHandler接口.实现内部类.
  119.                                 new InvocationHandler(){
  120.                                        
  121.                                         //用内部类覆盖InvocationHandler中的方法proxy 代表对象,  method,代表对象的方法, args代表参数
  122.                                         public Object invoke(Object proxy, Method method, Object[] args)
  123.                                         throws Throwable {                                       
  124.                                                 // TODO Auto-generated method stub
  125. //                                                long beginTime = System.currentTimeMillis();
  126. //                                                Object retVal = method.invoke(target, args);
  127. //                                                long endTime = System.currentTimeMillis();
  128. //                                                System.out.println("retVal run of " +(beginTime-endTime));
  129. //                                                return retVal;
  130.                                                 
  131.                                                 //获取程序开始时间
  132.                                                 advice.beforeMethod(method);
  133.                                                 
  134.                                                 Object retVal = method.invoke(target, args);
  135.                                                 
  136.                                                 //获取结束时间
  137.                                                 advice.afterMethod(method);
  138.                                                 
  139.                                                 return retVal;
  140.                                         }                                
  141.                                 }
  142.                                 );
  143.                 return proxy3;
  144.         }
  145.         //set和get方法
  146.         public Advice getAdvice() {
  147.                 return advice;
  148.         }
  149.         public void setAdvice(Advice advice) {
  150.                 this.advice = advice;
  151.         }
  152.         public Object getTarget() {
  153.                 return target;
  154.         }
  155.         public void setTarget(Object target) {
  156.                 this.target = target;
  157.         }

  158. }
  159. *************************************444444444***********************
  160. package cn.itcast.day03;

  161. import java.lang.reflect.Method;

  162. public class MyAdvice implements Advice {
  163.         long beginTime =0;
  164.         public void afterMethod(Method method) {
  165.                 // TODO Auto-generated method stub
  166.                 System.out.println("传智播客毕业了");
  167.                 long endTime = System.currentTimeMillis();
  168.                 System.out.println("retVal run of " +(beginTime-endTime));
  169.                
  170.         }

  171.         public void beforeMethod(Method method){
  172.                 // TODO Auto-generated method stub
  173.                 System.out.println("传智播客开学了");
  174.                 beginTime = System.currentTimeMillis();

  175.         }

  176. }
  177. *******************************5555555555********************************
  178. package cn.itcast.day03;

  179. import java.lang.reflect.Method;

  180. public interface Advice {
  181.         void afterMethod(Method method);
  182.         void beforeMethod(Method method);
  183. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

2 个回复

倒序浏览
鑫  哥~~帮顶了~还木有看到~~{:soso_e151:}
回复 使用道具 举报
下一句你都看的明白,这句咋就不懂了呀。
Advice advice = (Advice)Class.forName(props.getProperty(name + ".advice")).newInstance();
1、首先这句话的总体意思就是:创建一个Advice对象(意思通告),此对象通过setAdvice传递给proxyFactoryBean。通过这个Advice对象可以在委托类target之前之后或catch中调用其中的方法,实现代理所要实现的功能。
2、name+".advice"这句和你在配置文件中配置信息有关系的。视频里面配置的是:xxx.advice=xxxxx   ,所以要用xxx.advice这个Key才能获取对应的Value了,而这里的name是xxx 所以要在后面再连接咯字符串".advice"构成完整的Key啊。  
其他的你应该就明白了。。。
视频可以多看几遍,多思考,多总结,可以把Properties再复习下。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马