spring源码:创建单例对象时用到了ObjectFactory匿名类

来源:互联网 发布:国密算法sm2证书制作 编辑:程序博客网 时间:2024/05/16 12:18

记得在学习java语言时,书本和前辈都都着重强调接口是不能实例化的。


但如果你阅读spring源码时,你会发现有如下片段:

if (mbd.isSingleton()) {   sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {      @Override      public Object getObject() throws BeansException {         try {            return createBean(beanName, mbd, args);         }         catch (BeansException ex) {            // Explicitly remove instance from singleton cache: It might have been put there            // eagerly by the creation process, to allow for circular reference resolution.            // Also remove any beans that received a temporary reference to the bean.            destroySingleton(beanName);            throw ex;         }      }   });   bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}
以上是org.springframework.beans.factory.support.AbstractBeanFactory代码片段。而new出来的对象并没有实际的类作为载体,是不是很奇怪。

这就是 匿名内部类,相当于一个匿名的类实现了这个接口,只不过把类的实例化和类的实现都写在一起了。


那为何要使用匿名内部类

Think in java上说:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。它能够非常好的解决多重继承的问题,在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。


参考:https://www.cnblogs.com/chenssy/p/3388487.html

阅读全文
0 0