当前位置:编程学习 > JAVA >>

动态代理和aop分别是什么? 他们有什么联系啊!

动态代理是怎么一回事,在hibernate中懒加载用返回的是代理对象! 他和get方法返回的对象有什么不同? 还有aop和动态代理又有什么关系? 麻烦各位高手指点! 谢谢!! --------------------编程问答-------------------- @Test
public void testLoad() {

Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, 1);

session.getTransaction().commit();
System.out.println(t.getClass());
//System.out.println(t.getName());
}

@Test
public void testGet() {

Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, 1);

session.getTransaction().commit();
System.out.println(t.getClass());
//System.out.println(t.getName());
}

比如,有一个teacher类
区别1:
在数据库中没有对象时,get和load表现不一样,load返回的是动态代理对象,只有真正用到对象时才会到数据库中查找,比如,在数据库中没有编号为1的teacher对象,
那么在 Teacher t = (Teacher)session.load(Teacher.class, 1);
运行到这句时不会报错,只有运行到System.out.println(t.getClass());才会提示对象不存在
而对于get方法 Teacher t = (Teacher)session.get(Teacher.class, 1);会直接报错;
区别2:
安装了log4j并且hibernate配置文件中设置了打印SQL语句时,两者的区别很好看出
运行     @Test
public void testLoad() {

Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, 1);

session.getTransaction().commit();
//System.out.println(t.getClass());
//System.out.println(t.getName());
}
在后台不会打印出sql语句,即没有用到对象时不会发出sql语句;
而get方法则会直接打印出sql语句;

如果还不是很明白可以看看尚学堂马士兵的hibernate3.3.2_coreAPI_get_load.avi (可以在尚学堂网站中直接下载)讲的还比较清楚;

动态代理部分可以看看设计模式中动态代理部分,个人觉得动态代理是设计模式中的最难的一个设计模式,理解了动态模式对于理解spring中的aop何动态代理的区别也有很好帮助,个人也在学习中,还不能解答。

         --------------------编程问答-------------------- 而对于get方法 Teacher t = (Teacher)session.get(Teacher.class, 1);会直接报错;
楼上的兄弟,这个你说错了,如果报不到的话get方法会返回一个null值,表示空对象,不会报错,但运行到
System.out.println(t.getClass());就会报错了,因为这个时候t是null --------------------编程问答-------------------- 动态代理是运行期扩展类中的服务细节生成新的类,aop是面向切面编程思想,两码事儿。 --------------------编程问答-------------------- Hibernate返回的对象是cglib生成的。

spring的AOP默认对于接口的是动态代理来实现AOP的。

这个一句话也说不清楚。
这里是个动态代理的例子,不知能否看明白
http://code.google.com/p/simplejee/source/browse/#svn/trunk/simplejee/src/com/yuqiaotech/simplejee/javase/reflect/proxy

另外还有一段
http://code.google.com/p/simplejee/source/browse/trunk/simplejee/src/com/yuqiaotech/simplejee/dao/ObjectFactory.java#25

注释掉的一段代码是使用动态代理的方式产生一个实现了UserDao接口的对象。比上面一段使用代理模式的方法简洁一些,特别是大量需要添加功能的时候。 --------------------编程问答--------------------
引用 3 楼 dinghun8leech 的回复:
动态代理是运行期扩展类中的服务细节生成新的类,aop是面向切面编程思想,两码事儿。


不 可能是一回事 AOP是基于动态代理实现的 --------------------编程问答-------------------- 每天回帖即可获得10分可用分! --------------------编程问答-------------------- 学习了 --------------------编程问答--------------------
代理模式、动态代理和面向方面
代理的意思很好理解,它借鉴了我们日常所用的代理的意思:就是本来该自己亲自去做的某件事,由于某种原因不能直接做,而只能请人代替你做,这个被你 请来做事的人就是代理。比如过春节要回家,由于你要上班,没时间去买票,就得票务中介代你购买,这就是一种代理模式。

关于动态代理和AOP的如何尽快入门


动态代理和AOP的实例详解





--------------------编程问答-------------------- 哦!谢谢大家了!这个问题我大概了解了! --------------------编程问答-------------------- spring的aop其实就是用的动态代理 或者cglib来实现的 --------------------编程问答-------------------- .




. --------------------编程问答--------------------
引用 3 楼 dinghun8leech 的回复:
动态代理是运行期扩展类中的服务细节生成新的类,aop是面向切面编程思想,两码事儿。


看来你这个星级 也是灌水灌出来的吧

aop的底层实现就是通过动态代理了 --------------------编程问答--------------------
引用 5 楼 bearkin 的回复:
引用 3 楼 dinghun8leech 的回复:
动态代理是运行期扩展类中的服务细节生成新的类,aop是面向切面编程思想,两码事儿。


不 可能是一回事 AOP是基于动态代理实现的

动态代理是AOP的具体实现 --------------------编程问答-------------------- --------------------编程问答-------------------- 代理  动态代理 可否举例明细一下 --------------------编程问答-------------------- 求高手详细解释下。 --------------------编程问答--------------------
引用 12 楼 magicluo 的回复:
引用 3 楼 dinghun8leech 的回复:
动态代理是运行期扩展类中的服务细节生成新的类,aop是面向切面编程思想,两码事儿。


看来你这个星级 也是灌水灌出来的吧

aop的底层实现就是通过动态代理了


aop有很多种实现方式,不一定非得是动态代理,百度一下:Javassist

--------------------编程问答-------------------- aop是一种思想  

动态代理是aop的一种实现   

明白? --------------------编程问答--------------------
引用 17 楼 goldenfish1919 的回复:
引用 12 楼 magicluo 的回复:

引用 3 楼 dinghun8leech 的回复:
动态代理是运行期扩展类中的服务细节生成新的类,aop是面向切面编程思想,两码事儿。


看来你这个星级 也是灌水灌出来的吧

aop的底层实现就是通过动态代理了


aop有很多种实现方式,不一定非得是动态代理,百度一下:Javassist

大哥,javassist是运行期修改和创建类的库。这个东西就是用来做动态代理的。只不过Hibernate是用Cglib做的。 --------------------编程问答--------------------
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,