前些天学习Spring注入时候,当实现类实现了接口类时,注入bean就是接口类,否则会报错;相反如果没有实现接口的接口类,注入的就是实例类对象,于是对此问题便产生了些疑惑。我们都知道Srping的bean注入就是通过反射机制以及动态代理实现的,而Spring是怎么实现两种情况的bean注入呢。后来通过资料和源码可知,是采用了两种动态代理机制:Spring AOP中,当拦截对象实现了接口时,生成方式是用JDK的Proxy类;当没有实现任何接口时用的是GCLIB开源项目生成的拦截类的子类。
下面分别实现了JDK与CGLib的动态代理,我们可以从代码中清晰发现二者区别:
JDK的动态代理实现:
package proxy;
public interface Subject {
public void doSomething();
}
package proxy;
public class RealSubject implements Subject{
public void doSomething() {
System.out.println("doing something...");
}
}
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//JDK是需要实现InvocationHandler接口
public class ProxyHandler implements InvocationHandler{
private Object target;
public ProxyHa