分为两大类:1.静态代理;2.动态代理;
代理的目的呢一般是为了增强他的功能这样子说也不太对,肯定是为了修改他的某些功能;静态代理跟动态代理都可以达到这个目的,只不过动态代理实现后更好维护,耦合性更低;
先说说动态代理:动态代理分为,jdk动态代理(面向接口),cglib动态代理(创建子类的方式来代理);动态代理跟静态代理的区别是没有写出来代理的,这样子就不会存在写死这种情况,代理的人是利用反射原理动态生成的,在已经写好的文件中是没有单独的文件创建出代理人的。比如jdk代理,你只找得到要代理的接口,和这个接口的实现类,代理人是后面你需要时才动态Proxy.newproxyinstance出来的;
举个jdk动态代理例子:
先创建一个快递公司的接口然后sunfeng是他的实现类;
接口:
实现类
接下来写一个测试类:
proxy记得要强转一下,proxy(代理)与target(被代理的对象)是兄弟关系,平级,你不能强转proxy乘target对相应的类,只能转为被代理接口;
运行结果:
=================================================
接下来写cglib的动态代理:
1.先引入cglib的依赖
net.sourceforge.cglib com.springsource.net.sf.cglib2.1.3
2.cglib要求想要被代理的类不能是final修饰的,因为final修饰的不可以被继承,而cglib动态代理的原理就是创建出被代理对象的子类;
cglib动态代理不需要接口所以只需要一个即将被代理的实现类即可:
然后接下来直接写一个测试类:
运行结果:
===========================================
接下来就是静态代理:静态代理也跟动态代理一样分成两类:分别是以父子类继承形式实现,以接口实现;
1.父子类方式
只有一个被代理的类和代理人(继承被代理人的类然后重写他的方法增加他的功能;)
测试类和结果:
2.接口方式实现静态代理:
代理人与被代理人都要实现被代理接口
代理人利用ioc控制反转依赖注入的方法被动地等待别人传进来给他要代理的对象而不是知己把他写死,不然不好改,代码写死了;
测试程序以及结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)