Java 有人在用Qi4J吗

Java 有人在用Qi4J吗,java,dependency-injection,apache-zest,cop,Java,Dependency Injection,Apache Zest,Cop,早些时候,我读了一篇关于面向复合编程的InfoQ文章: 我很想知道是否有人正在使用(或已经使用)这个框架 与使用传统的依赖注入框架(如Spring)将类连接在一起相比,它的性能如何。从维护的角度来看,生成的对象图(基于mixin而非类)更容易处理吗?在阅读了链接文章的第一部分后,我不喜欢两件事: 这些实现是在接口中定义的(使用@Mixins)-如果这些实现应该被模拟,或者实现被更改了怎么办 需要浇铸 由于没有使用Qi4J的经验,我不能说这在实践中会如何,但感觉不太好。好吧,我自己在一个项目

早些时候,我读了一篇关于面向复合编程的InfoQ文章:

我很想知道是否有人正在使用(或已经使用)这个框架


与使用传统的依赖注入框架(如Spring)将类连接在一起相比,它的性能如何。从维护的角度来看,生成的对象图(基于mixin而非类)更容易处理吗?

在阅读了链接文章的第一部分后,我不喜欢两件事:

  • 这些实现是在接口中定义的(使用
    @Mixins
    )-如果这些实现应该被模拟,或者实现被更改了怎么办
  • 需要浇铸

由于没有使用Qi4J的经验,我不能说这在实践中会如何,但感觉不太好。

好吧,我自己在一个项目中使用Qi4J已经有一年了。一旦您习惯了域模型中mixin的强大功能,您就会想知道以前没有mixin是如何管理的。事实上,我认为创建域模型的POJO方法应该已经过时了。它创建了系统性的不可维护代码。因为mixin/composite模型是Qi4j的重要特性,而不是DI,所以在Java平台上没有任何比较

至于波佐的担忧:在宣布混入时,有两种不同的情况。在实体(即域模型)中,一个接口通常只有一个实现,实际上,出于维护和可读性的原因,您希望主动避免有多个实现。因此,我在接口中直接声明了实现。但是,它只是一个默认值,如果您愿意,它可以被复合项覆盖。到目前为止,我还没有找到这样做的必要性

另一种情况是服务,这是完全不同的。在许多情况下,只有一个实现,因此在接口中声明实现也是很好的。但是,对于需要不同实现的服务,情况要多得多,因此对于这些情况,您只需在具体的复合类型声明中声明mixin即可。因此,这两种样式都是可能的,并且由于各种原因而推荐


至于铸造,能够铸造一个对象是一个奖励,而不是一个问题。如果你没有从一个角色转换到另一个角色,你就必须很有创造性地绕过它,这可能不会使你的代码更简单。

希望这次讨论不会太晚: 但我就是这么看的

首先,我喜欢Qi4j背后的想法(复合、混合、组装),但由于使用它的复杂性,我感到有些犹豫

那里的概念应该是更广泛的保护伞的一部分,比如语言(比如Java)而不是框架,并且应该更易于使用

两年前我遇到了一个问题,当时我希望自己能有这样的东西

我想要3种可以在一组bean上重用的不同行为。有些豆子把它们都用掉了,有些豆子把两者结合起来使用。我不想把它们都放在一节课上,因为这没有意义。另一方面,我受到一个事实的限制,那就是我不能有多重继承。显而易见的解决方案是:使用接口;也就是说,要多次实施。 我记得曾向一位同事抱怨,我希望自己有办法为接口提供默认实现。对我来说,这是一个简单的OO概念,它允许人们以更干净的方式重用行为。如果您需要的是与默认实现不同的东西,则可以实现该实现。这将更有意义,不会阻碍我所看到的任何自然法则


所以为了回答你的问题,我认为这个Qi4j的概念允许你以更干净的方式思考OO,其中Spring更具结构性,甚至在概念上不具有可比性。你可能在考虑依赖注入而不是spring,可能在考虑Qi4j而不是dept注入。

当我在2分钟、10分钟等教程中阅读Qi4j时(最后一个不完整),我想到的一个明显的问题是如何将其与JPA/Hibernate管理的实体集成?我希望看到一个与JPA无缝集成的解决方案。在我看来,没有JPA意味着没有采用Qi4j。我很想看到作者的一篇文章,其中展示了与JPA和Spring的集成,这两个东西在Java企业界有着深刻的渗透。如果整合是直接的,那么很快就会被采用。

Bozho;关于在接口上声明mixin的问题

Mixin实现可以在“更高”(即子)接口中被重写,因为实现的查找顺序发生在“每个方法”中,从声明的接口开始,从左到右,然后到每个超级接口(在extends子句中也是从左到右)。或者,可以在组合的部件中替代

public void assemble( ModuleAssembly module )
{
    module.entities( Account.class ).withMixins( LdapAuthenticatorMixin.class );
    :
}

其中LDAPAuthenticatormyxin可能是抽象的,并且仅覆盖单个方法。

Kabram;与JPA的集成已经尝试了不止一次。如果我们有两种相互重叠但不完全兼容的技术,那么最终只会出现各种可能性的交叉。因此,有两种基本的方法来集成Qi4j和JPA

  • 限制JPA选项,以便能够充分利用Qi4j需要的更灵活的数据结构。这样做毫无意义,因为直接访问SQL的性能要高得多,而这正是我们所选择的

  • 将Qi4j的数据模型限制为适合现有JPA数据模型。这样做将剥夺人们为什么首先选择Qi4j的大部分优势。因此,我们决定不花周期来做这件事。然而,我认为Qi4j的可扩展性足以在不破坏核心运行时的情况下进行此类集成,并且只需创建EntityStore

  • 我没有用过Qi4J。