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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Jam-l 中级黑马   /  2013-9-28 13:06  /  2936 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Jam-l 于 2013-9-28 20:11 编辑
  1. public class ProxyFactoryBean {
  2.         private Advice advice;
  3.         private Object target;
  4.         
  5.         public void setAdvice(Advice advice) {
  6.                 this.advice = advice;
  7.         }

  8.         public void setTarget(Object target) {
  9.                 this.target = target;
  10.         }
  11.         public Object getProxy() {
  12.                 return Proxy.newProxyInstance(
  13.                         target.getClass().getClassLoader(),
  14.                         target.getClass().getInterfaces(),
  15.                         new InvocationHandler() {
  16.                                 @Override
  17.                                 public Object invoke(Object proxy, Method method, Object[] args)
  18.                                                 throws Throwable {
  19.                                         advice.beforeMethod(method);
  20.                                         Object objVal = method.invoke(target, args);
  21.                                         advice.afterMethod(method);
  22.                                         return objVal;
  23.                                 }
  24.                         });
  25.         }
  26. }
复制代码
代码中定义了两个成员变量,到底动态代理的是哪个变量? 这两个变量分别代表什么意思?

评分

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

查看全部评分

11 个回复

正序浏览
Jam-l 发表于 2013-9-28 19:07
哦哦,这个是张孝祥老师基础加强的56.实现类似spring的可配置的AOP框架啊,看得我一头雾水,看了你的解释 ...

= =我就说,没看过,我刚好跳过了那个视频。。你明白就好,先把前面的搞懂,不必要没明白就去搞框架
回复 使用道具 举报
Jam-l 中级黑马 2013-9-28 19:07:29
11#
罗凯健 发表于 2013-9-28 18:47
。。你搞清楚代理没有,你这个例子是从哪来的。现在你只要知道主干部分,Proxy.newProxyInstance方法里面 ...

哦哦,这个是张孝祥老师基础加强的56.实现类似spring的可配置的AOP框架啊,看得我一头雾水,看了你的解释我明白点了,谢谢你的热心解释!!
回复 使用道具 举报
Jam-l 发表于 2013-9-28 17:41
配置文件xxx是ArrayList的话就不使用代理,如果是proxy就使用代理。
那使用了代理以后,还有两个配置就是 ...

。。你搞清楚代理没有,你这个例子是从哪来的。现在你只要知道主干部分,Proxy.newProxyInstance方法里面已经帮你实现接口了,那个Advice和MyAdvice跟生成代理类没有一毛钱的关系,你先不用管那么多。假如不懂先去看看视频,我觉得说的已经够清晰的了
回复 使用道具 举报
Jam-l 中级黑马 2013-9-28 17:41:56
9#
罗凯健 发表于 2013-9-28 15:51
我这样说你可能会比较明白:
target就是需要被代理的类,Advice就是代理类在帮你做事情之后(或之前)还要 ...

配置文件xxx是ArrayList的话就不使用代理,如果是proxy就使用代理。
那使用了代理以后,还有两个配置就是xxx.advice和xxx.target
那这个代理类是xxx.target 的话就是ArrayList类是被代理对象,而这个类而外没写接口和实现类。
但是xxx.advice:MyAdvice写了接口和实现类,那意思是代理可以不用写接口和实现类了?MyAdvice只是而外的建议类?
回复 使用道具 举报
Jam-l 中级黑马 2013-9-28 17:18:25
8#
补充另外两个类BeanFactory类:
  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.util.Properties;

  4. public class BeanFactory {
  5.        
  6.         Properties props = new Properties();
  7.         public BeanFactory(InputStream ips){
  8.                 try {
  9.                         props.load(ips);
  10.                 } catch (IOException e) {
  11.                         e.printStackTrace();
  12.                 }
  13.         }
  14.         public Object getBean(String name){
  15.                 String        className = props.getProperty(name);
  16.                 Object bean = null;
  17.                 try {
  18.                         Class clazz = Class.forName(className);
  19.                         bean = clazz.newInstance();
  20.                 } catch (Exception e) {
  21.                         e.printStackTrace();
  22.                 }
  23.                 if(bean instanceof ProxyFactoryBean){
  24.                         Object proxy = null;
  25.                         try {
  26.                                 ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
  27.                                 Advice advice = (Advice) Class.forName(props.getProperty(name + ".advice")).newInstance();
  28.                                 Object target = Class.forName(props.getProperty(name + ".target")).newInstance();
  29.                                 proxyFactoryBean.setAdvice(advice);
  30.                                 proxyFactoryBean.setTarget(target);
  31.                                 proxy = proxyFactoryBean.getProxy();
  32.                         } catch (Exception e) {
  33.                                 e.printStackTrace();
  34.                         }
  35.                         return proxy;
  36.                 }
  37.                 return bean;
  38.         }
  39. }
复制代码
AopFrameworkTest 类:

  1. public class AopFrameworkTest {
  2.         public static void main(String[] args) {
  3.                 InputStream ips = AopFrameworkTest.class.getResourceAsStream("config.properties");
  4.                 Collection bean = (Collection) new BeanFactory(ips).getBean("xxx");
  5.                 System.out.println(bean.getClass().getName());
  6.         }
  7. }
复制代码
一共就这5个类,在加一个properties配置列表文件
  1. xxx = no56.ProxyFactoryBean
  2. #xxx = java.util.ArrayList
  3. xxx.advice = no56.MyAdvice
  4. xxx.target = java.util.ArrayList
复制代码
配置xxx是java.util.ArrayList打印出的类名就是java.util.ArrayList
配置xxx是no56.ProxyFactoryBean打印出的类名就是com.sun.proxy.$Proxy0
这是基础加强里的实现类似spring的可配置的AOP框架,我就是不太明白被代理的对象是哪个? advice和target分别代表什么,起什么作用?
回复 使用道具 举报
我这样说你可能会比较明白:
target就是需要被代理的类,Advice就是代理类在帮你做事情之后(或之前)还要做的,是面向切面的部分,比如进行系统日志记录,异常信息捕捉输出等等,实际上是一些功能封装起来的类。

代理类就是通过你写的方法创造出来的类,它拥有target的方法,只是在调用这些方法的时候还会额外干点什么。这恰好是代理类的作用
回复 使用道具 举报
代理可以拦截被代理类的所有方法:代理的是target变量,你的代码不全并不知你的Advice类,不明白的可以http://blog.sina.com.cn/s/blog_c18d53c90101a3so.html到我博客:
回复 使用道具 举报
Jam-l 来自手机 中级黑马 2013-9-28 14:05:11
报纸
a283398689 发表于 2013-9-28 13:28
动态代理是需要4个类的 你才2个,~    按我刚才说的去做 百度复制代码。,



不好意思,一共5个类,因为太多,只发了部分没发全,现在不在家,等下午回去我再补全。
回复 使用道具 举报
Jam-l 发表于 2013-9-28 13:21
这个是Advice的借口类:这个是自定义Advice类:按理说我觉得Advice是代理对象,但是 method.invoke(targe ...

动态代理是需要4个类的 你才2个,~    按我刚才说的去做 百度复制代码。,




接口要去实现的
回复 使用道具 举报
a283398689 发表于 2013-9-28 13:17
你不需要管那个~  自己百度一下 自己测试最知道,  我简单的告诉你~ 动态代理用去实现接口。,  用jdk的 ...

这个是Advice的借口类:
  1. package no56;

  2. import java.lang.reflect.Method;

  3. public interface Advice {
  4.         //定义两个方法
  5.         public void afterMethod(Method method);
  6.         public void beforeMethod(Method method);
  7. }
复制代码
这个是自定义Advice类:
  1. import java.lang.reflect.Method;

  2. public class MyAdvice implements Advice{
  3.         public void afterMethod(Method method) {
  4.                 System.out.println(method.getName() + " :running...afterMethod");
  5.         }

  6.         public void beforeMethod(Method method) {
  7.                 System.out.println(method.getName() + " :running...beforeMethod");
  8.         }
  9. }
复制代码
按理说我觉得Advice是代理对象,但是 method.invoke(target, args) 方法调用的对象又是target,所以不明白哪个是代理的对象。
回复 使用道具 举报
  你不需要管那个~  自己百度一下 自己测试最知道,  我简单的告诉你~ 动态代理用去实现接口。,  用jdk的反射机制,  简单的来说。 作用是  类 b  已经实现a 接口。  我不想修改这2个,~  我可以用动态代理 在调用 B 的时候 前面加点处理 后面加点处理 你就明白呢~

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马