首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从框架到简单java接口实现接口

从框架到简单java接口实现接口
EN

Stack Overflow用户
提问于 2014-01-27 08:19:15
回答 3查看 701关注 0票数 0

我不清楚这个概念。

我为一个实例Spring开发了几个框架。为了实现一个特性,我们总是实现框架提供的一些接口。

对于一个实例,如果我必须在Spring中创建一个自定义作用域,我的类实现了一个org.springframework.beans.factory.config.Scope接口。它具有一些预定义的低级别功能,这有助于为bean定义自定义范围。

在Java中,我读到的接口只是一个声明,类可以实现和定义它们自己的功能。接口的方法没有预定义的功能。

代码语言:javascript
复制
interface Car
{
topSpeed();
acclerate();
deaccelrate();
}

这里的方法没有任何功能。他们刚刚被宣布。

有人能解释这个概念上的差异吗?框架如何将一些预定义的功能与接口方法结合起来?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-27 08:22:59

它没有在方法中添加预定义的功能。但是当你实现

类C中的一些接口(比如I),框架知道您的对象(类型为C)

实现I接口,并可以在对象上调用某些方法(在i中定义)

因此,向对象发送一些信号/事件。这些事件可以是“应用程序初始化”,

“应用程序启动”,“应用程序停止”,“应用程序被破坏”。所以通常这就是框架所做的。

我在这里谈论的是总体框架,而不是特别是Spring。

票数 0
EN

Stack Overflow用户

发布于 2014-01-27 08:23:09

事实上,在概念上并没有什么不同。每个java接口方法都有一个非常明确的责任(通常在其javadoc中描述)。以Collection.size()为例。它被定义为返回集合中的元素数。让它返回一个随机数是可能的,但会给任何来电者带来无尽的悲伤。接口方法有定义的语义;)

票数 0
EN

Stack Overflow用户

发布于 2014-01-27 10:17:09

正如我在注释中提到的,在某种程度上,框架提供的实现接口被使用原型注释所取代。例如,您可以将类注释为@Entity,让Spring知道如何管理它,并将事务管理器编织到其中。

我怀疑您所看到的与Spring和其他框架如何使用动态代理注入功能有关。

对于Spring注入功能的一个例子,如果您将一个方法注释为@Transactional,那么该框架将尝试创建一个动态代理,它包装了对您方法的访问。也就是说,当某个东西调用您的"save()“方法时,该调用实际上是对代理的调用,它可能会在将调用传递给您的实现之前启动事务,然后在您的方法完成后关闭事务。

如果您已经定义了一个接口,Spring就能够在运行时做到这一点,因为它能够创建一个与类实现相同接口的动态代理。所以如果你有:

代码语言:javascript
复制
@Autowired
MyServiceInterface myService;

它被注入SpringDynamicProxyToMyServiceImpl而不是MyServiceImpl。

但是,对于Spring,您可能已经注意到,您并不总是需要使用接口。这是因为它还允许AspectJ编译时编织。使用AspectJ实际上在编译时将该功能注入到类中,这样您就不再被迫使用接口和实现。您可以在这里阅读更多关于Spring的内容:

http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#aop-introduction-defn

我应该指出,虽然Spring通常使您能够避免为bean定义接口和实现,但利用它不是一个好主意。使用单独的接口和实现对于单元测试非常有价值,因为它使您能够执行诸如注入实现接口的存根之类的操作,而不是需要数据库访问和其他丰富功能的完整实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21375902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档