标签:
杂谈 |
本文通过一个小例子,轻量化的说明了Spring Ioc的原理是反射而不是New实例化对象。
本文http://www.paymoon.com:8001/index.php/2017/01/06/why-spring-ioc-mechanism-is-not-new-but-reflection/
如果转载请联系
今年面试了一个JavaWeb同学,其中问了他一个很经典的问题:
Spring IoC的原理是什么?
答案是反射。
这哥们没回答出来,其实我并没有意外,不知道为什么,很多同学,工作了三年左右,很多都答不出来,这哥们也没有放弃,他说了一个工厂模式。我问工厂里面呢,他说单例,又问单例里面怎么实例化类了呢,他说了个new。
这个问题就到这了,因为Spring在加载类的实例时,我们知道其实是用工厂的方式,给出一个个实例,而在工厂里面,用了单例,但是真正实例化,则是反射的newInstance来创建对象,而不是new。
那么,为什么是反射的newInstance,而不是new呢?
那么首先我们必须明白,Java里面,反射的目的是什么?
高内聚,低耦合。
进一步,反射比new的好处是什么?
反射不用知道类名,可以直接实例化类,也就是不用硬编码。
有人问了,不知道类名那怎么反射呢?
例子:
通过new,我们这么写:
A a
通过反射,我们这么写:
Class c = Class.forName(“A”);
factory = (AInterface)c.newInstance();
其中AInterface是类A的接口,如果下面这样写,你可能会理解:
String className = “A”;
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();
进一步,如果下面写,你可能会理解:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();
上面代码就消灭了A类名称,优点:无论A类怎么变化,上述代码不变,甚至可以更换A的兄弟类B , C ,
D….等,只要他们继承Ainterface就可以。
所以可以总结个答案:
反射可以不用类名实例化对象,并且降低耦合,避免了硬编码。
本文http://www.paymoon.com:8001/index.php/2017/01/06/why-spring-ioc-mechanism-is-not-new-but-reflection/
如果转载请联系
相关参考:
http://www.lai18.com/content/8565211.html?from=cancel

加载中…