spring动态代理
java动态代理一般有两种实现方式
-
JDK自带实现方法:代理的目标类必须有实现接口,生成出来的代理类只能转为接口实现类进行调用。
-
CGLIB包实现:实现方式是对代理的目标类进行继承,生成出了的代理类为目标类的子类,可以直接转换成目标类或目标类实现接口的实现类。
两种方式进行代理的原理都是动态生成java类,生成class文件,动态加载进内存。
在Spring AOP中,如果拦截对象未实现如何接口,输出的是代理类对象会形如Test$$EnhancerByCGLIB$$bb9b6a7c,而且它的父类是我们的代理目标类。说明是由CGLIB生成 的。如果拦截对象实现了接口,则会用JDK动态代理来生成代理类。
在Spring中,使用((Instrumentalist) context.getBean("kermit")).perform()这种方式获取bean时。如果bean没有继承任何接口,那么可以直接使用类名强制类型转换,因 为使用CGLIB生成的代理是目标类的子类;如果bean实现了某个接口,那么只能使用接口名进行强制转换,因为使用JDK自带的代理,实现的是接口。