具有动态实现的Spring简介

具有动态实现的Spring简介,spring,aop,mixins,Spring,Aop,Mixins,我试图使用Spring框架为一个类(让我们称它为C)动态实现一个特定的接口(让我们称它为I)。在春天,这被称为介绍(在其他语言中为mixin)。在编译时C不实现I。使用@DeclareParents注释,我可以用AspectJ语法实现它 问题在于I的实际实现(我们称之为IImpl)是独立的(不依赖于上下文)——我应该只在注释中提供IImpl类名。我想要实现的是以某种方式规定的实施。例如,我想为IImpl实例提供一个参数,比如封闭的C实例,这样IImpl中的逻辑将根据我要介绍的C实例而有所不同。我

我试图使用Spring框架为一个类(让我们称它为C)动态实现一个特定的接口(让我们称它为I)。在春天,这被称为介绍(在其他语言中为mixin)。在编译时C不实现I。使用@DeclareParents注释,我可以用AspectJ语法实现它

问题在于I的实际实现(我们称之为IImpl)是独立的(不依赖于上下文)——我应该只在注释中提供IImpl类名。我想要实现的是以某种方式规定的实施。例如,我想为IImpl实例提供一个参数,比如封闭的C实例,这样IImpl中的逻辑将根据我要介绍的C实例而有所不同。我需要一些方法来设置IImpl实例和引入的C实例之间的依赖关系

目前我找不到一个方法来做这件事。有什么想法吗


谢谢。

恐怕您正在寻找的解决方案的“形式”是不可能的,因为AJ字节码编织器(无论是编译还是加载时间)需要知道如何“实现”您的方法。 但是,我认为你的问题可能会以授权人的形式得到解决。基本上,您将告诉C使用IImpl实现接口I,并使用IImpl作为委托器,这意味着IImpl将把所有方法调用委托给一个可以在运行时配置/更改的IRuntimeImpl。IImpl基本上是:

public class IImpl implements I {
    private I delegate;

    public void interfaceMethod() {
        delegate.interfaceMethod()
    }
}
在运行时,您可以将为I选择的任何运行时实现传递给IImpl


/alex

但这正是问题所在-我如何将任何信息传递给IImpl?使用@DeclareParents,我只能提供IImpl的类名,而且我看不到传递其实例任何参数的方法。@Stas:我没有使用过这个功能,但我期望的是这样的。IImpl的实例由引擎生成/实例化。现在,您可以通过查看类注释来指示Spring执行其魔术,我认为可能有一种方法可以告诉Spring使用appcontext初始化IImpl