究竟什么是“动态代理”呢? 它是“
代理模式”的一种更灵活的应用,我通过生活中的
例子来说明一下代理和动态代理。
比如我们要买一台电脑,不需要去生产电脑的厂家,而只需要到当地的代售商出购买即可。因为代售商已经预先购进了某品牌的电脑,当
消费者来买的时候,可以直接将电脑卖出。这就是“代理模式”的体现,而代理商就是一个“代理角色”。但是这种代理模式存在一个问题:代售商只负责一个品牌的电脑,当消费者需要购买大量不同品牌电脑的时候,就要分别联系不同的代售商,这是一件很麻烦的事情。需要我们对营销机制进行改进,改进后的代售商将不预先购进电脑,等有消费者来购买电脑的时候,代理商再根据消费者需求去不同的生产厂家进货。这样一来,无论消费者需要多少品种的电脑,只需要一个代理商就能满足要求。这种模式便是“动态代理”。
代理模式:类结构的模式,优点就是不需要更改原有类(被代理类)就能增强原有类(被代理类)的功能,缺点就是必须实现原有类(被代理类)的
接口
JDK的动态代理:
优点就是不必“复制”原有类(被代理类)接口实现类,缺点就是必须为每个被代理类实现几乎一样的方法 ----这句话我
理解还不到位,请各位指点!
Spring默认采取的动态代理机制实现AOP,当动态代理不可用时(代理类无接口)会使用CGlib机制。但Spring的AOP有一定的缺点,第一个只能对方法进行切入,不能对接口,字段,静态代码块进行切入(切入接口的某个方法,则该接口下所有实现类的该方法将被切入)。第二个同类中的互相调用方法将不会使用代理类。因为要使用代理类必须从Spring容器中获取Bean。第三个性能不是最好的,我们使用
自定义类加载器,性能要优于动态代理和CGlib。
参考文章:http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/
http://newleague.iteye.com/blog/699086
http://www.iteye.com/topic/1116696