静守时光 2013-09-23 21:33
浏览 286
已采纳

关于Spring的BeanFacotry及子类,以接口方式却不采用抽象类的疑问

    首先我们说下抽象类和接口的区别。从面向对象的设计理念来看,抽象类是is-a的关系,即子类是父类的一种实现;而接口是行为的集合,即某类应该具有哪些行为,则实现相应的接口,类似“has-a”的关系。

    但Spring的IOC容器的核心BeanFactory,是具有最基本功能的工厂容器,其所有的子接口和子类如ApplicationContext、FileSystemXmlApplicationContext则是有各种各样功能的工厂容器,和BeanFactory应该是Is-a的关系,所以对BeanFactory及其容器子接口应该是抽象类来实现,而不是接口。

    但为什么Spring设计者把它们设计为接口呢?

  • 写回答

1条回答

  • zhujihuaalice 2013-09-24 10:03
    关注

    首先我觉得像spring这样的庞大的开源框架的设计理念,并不会完全遵守,一些常用的准则,肯定有自己独到之处,java中不支持继承多个抽象类,却支持接口的继承和扩展,这样,对于一个接口有若干继承接口,在java中就是很正常的事情,就像spring中beanfactory有很多的继承接口,这些接口大多数面向不同的环境,不同的使用场景,就相当于把spring核心容器接口提供的功能,通过定义不同接口的方式来做了汇总归类,降低了使用接口的复杂度,我所知道的spring中有相当部分的属于接口方法,但是却不适合向普通用户公开,这样,通过一个子接口就隐藏了这部分接口代码,同时又符合面向接口的设计。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥30 用arduino开发esp32控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题