Spring引入动态实现
我正在尝试使用 Spring 框架为类(我们称其为 C)动态实现特定接口(我们称其为 I)。 在 Spring 中,这称为引入(在其他语言中为 mixin)。 在编译时,C 不实现 I。使用 @DeclareParents 注释,我可以在 AspectJ 语法中实现它。
问题是 I 的实际实现(我们称之为 IImpl)是独立的(不依赖于上下文) - 我应该只在注释中提供 IImpl 类名。 我想要实现的是以某种方式规定的实施。 例如,我想为 IImpl 实例提供一个参数,例如封闭的 C 实例,以便 IImpl 中的逻辑会根据引入的 CI 实例而有所不同。 我需要某种方法来设置 IImpl 实例和引入的 C 实例之间的依赖关系。
目前我找不到办法做到这一点。 有任何想法吗?
谢谢。
I am trying to use Spring framework to dynamically implement a specific interface (lets call it I) for a class (let call it C). In Spring this is called introduction (mixin in other languages). In compile time C doesn't implement I. Using the @DeclareParents annotation I can do it in AspectJ syntax.
The problem is that the actual implementation of I (lets call it IImpl) is standalone (not dependent on the context) - I should only supply the IImpl class name in the annotation. What I want to achieve is the implementation that is stipulated in some way. For example, I would like to provide the IImpl instance with a parameter, say the enclosing C instance, so that the logic in IImpl would be different depending on what instance of C I am introducing. I need some way to set the dependecy between the IImpl instance and the introduced C instance.
Currently I cannot find a way to do it. Any ideas?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
恐怕您正在寻找的解决方案的“形式”是不可能的,因为 AJ 字节码编织器(与编译或加载时间无关)需要知道如何“实现”您的方法。
但是,我认为您的问题可能会以委托人的形式得到解决。 基本上,您将告诉 C 使用 IImpl 实现接口 I 并使用 IImpl 作为委托者,这意味着 IImpl 会将所有方法调用委托给可以在运行时配置/更改的 IRuntimeImpl。 IImpl 基本上是:
在运行时,您将能够将您为 I 选择的任何运行时实现传递给 IImpl
。./alex
I'm afraid the 'form' of the solution you are looking for is not possible as the AJ bytecode weaver (doesn't matter if compile or load time) needs to know how to 'implement' your methods.
But, I think there might be a solution for your question in the form of a delegator. Basically, you'll tell C to implement interface I using IImpl and use IImpl as a delegator, meaning that IImpl will delegate all method calls to an IRuntimeImpl that can be configured/changed in at runtime. IImpl will basically be:
At runtime you'll be able to pass to IImpl whatever runtime implementation you pick for I.
./alex