为什么Java框架不强制使用接口?

时间:2011-08-28 13:58:47

标签: java architecture frameworks

我只是想知道,为什么没有Spring Bean或EJB Bean(或OSGi服务)的接口?我知道没有必要这样做,因为框架可以使用反射API来调用方法,但是如果使用接口而不是更少的错误吗?

例如,为什么没有OSGi组件的接口,如下所示:

interface OSGIComponent {
  void activate(BundleContext context);
  ... 
}

3 个答案:

答案 0 :(得分:2)

  

我只是想知道,为什么Spring Bean没有接口   或EJB Bean(或OSGi服务)?

在第三版之前,EJB标准 “强制使用接口”。实际上,每个bean(Home,Remote和Local)必须至少有两个,通常是三个接口。除了实现类没有实现这些接口,你必须有一个XML部署描述符将所有东西连接在一起,如果有什么不适合(例如由于拼写错误),你会得到一个完全神秘的运行时错误。这是一场绝对的噩梦,即使这个错误在几年前就被修复了,EJB到目前为止仍然声名狼借。

  

我知道没有必要这样做,因为框架可以使用反射API来调用方法

这完全没有意义。

  

但如果使用接口而不是更少的错误吗?

界面不是神奇的尘埃,使代码“不那么错误”。如果您的API可能有多个实现,则可以创建一个接口。否则你不会。就是这样。

答案 1 :(得分:2)

对于Spring,您不必实现特定于Spring的接口,以便能够将Spring与您的代码一起使用。这实际上被视为一个优势:它可以防止您的代码与Spring绑定,从而使其更具可移植性。

这并不是说您无法实现特定于Spring的接口。一个让人想起的例子(没有双关语意)是InitializingBean;这定义了一个方法afterPropertiesSet(),在Spring实例化你的bean并设置它的所有属性后,它被调用(顾名思义)。

因此,您可以使用特定于框架的接口和类;你必须平衡保持代码的可移植性,并利用框架提供的有用东西。

您举例说明了可能实现OSGIComponent接口的OSGi组件。 Spring实际上有一个接口,您的类可以实现它来传递对包含Spring上下文的引用:ApplicationContextAware。但是,通常,您不需要使用这些特定于框架的接口。如果代码只关注实际的业务逻辑,而不是框架如何实例化对象,将对象连接在一起等等,那么代码通常更容易理解。

答案 2 :(得分:0)

如果bean必须实现接口,那么该接口必须存在于类路径中,导致bean依赖于正在使用的依赖注入框架(至少在JSR-330中依赖注入注释的标准化之前,以及现在我们想要向后兼容)。

但是,在Spring中,bean 可以实现与容器交互的接口,例如InitializingBeanDisposableBean。 (source