我只是想知道,为什么没有Spring Bean或EJB Bean(或OSGi服务)的接口?我知道没有必要这样做,因为框架可以使用反射API来调用方法,但是如果使用接口而不是更少的错误吗?
例如,为什么没有OSGi组件的接口,如下所示:
interface OSGIComponent {
void activate(BundleContext context);
...
}
答案 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 可以实现与容器交互的接口,例如InitializingBean
和DisposableBean
。 (source)