我试图使用Annotation Processors来生成特定Factory接口的实现.这些接口看起来如下:
public interface ViewFactory<T extends View> {
<S extends Presenter<T>> T create(S presenter);
}
Run Code Online (Sandbox Code Playgroud)
和
public interface PresenterFactory<T extends View> {
<S extends Presenter<T>> S create();
}
Run Code Online (Sandbox Code Playgroud)
Annotation Processor正在执行正确的操作,并为每个匹配的类生成一个工厂,该工厂使用相应的注释进行注释.
注释处理器的输出如下:
public final class TestViewImplFactory implements ViewFactory {
public final TestView create(TestPresenter presenter) {
return new TestViewImpl(presenter);
}
}
Run Code Online (Sandbox Code Playgroud)
和相应的其他类:
public final class TestPresenterImplFactory implements PresenterFactory {
public final TestPresenter create() {
return new TestPresenterImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,TestViewImplFactory无法编译.错误消息是:
"类'TestViewImplFactory'必须声明为abstract或在'ViewFactory'中实现抽象方法create(S)"
Java说,以下是正确的:
@Override
public View create(Presenter presenter) {
return new …Run Code Online (Sandbox Code Playgroud) 我试图在MVP模式中实现一种将View和Presenter分离的方法,以提供一个框架,这正是这样做的,但在一点之后我感到困惑.
我有一个View接口,其中包含连接的演示者的泛型类型,反之亦然.这些接口将由实现开发人员扩展.具体的界面对这个问题不感兴趣,但这些界面的类定义如下所示:
public interface Presenter<T extends View>
Run Code Online (Sandbox Code Playgroud)
和
public interface View<T extends Presenter>
Run Code Online (Sandbox Code Playgroud)
这个想法是View和Presenter都知道对立的界面.
对于使用此结构,开发人员应提供工厂,实例化他想要显示的视图和处理此视图的Presenter.他把它们都给了一个名为SuperController的类.它们与View的类相关联.
创建Presenter的PresenterFactory接口没有参数,并返回Presenter实现,并查看以下内容:
public interface PresenterFactory<T extends View> {
<S extends Presenter<T>> S create();
}
Run Code Online (Sandbox Code Playgroud)
创建View的ViewFactory接口基于Presenter创建View实现,并查看以下内容:
public interface ViewFactory<T extends View, S extends Presenter<T>> {
T create(S presenter);
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题如下:
我想提供一个TestView和TestPresenter的示例.那些看起来像这样:
public interface TestPresenter extends Presenter<TestView> {...}
public interface TestView extends View<TestPresenter> {...}
Run Code Online (Sandbox Code Playgroud)
此外,还提供了ViewFactory,如下所示:
class TestViewFactory implements ViewFactory<TestView, TestPresenter> {
@Override
public TestView create(TestPresenter presenter) {
return new TestViewImpl(presenter);
}
}
Run Code Online (Sandbox Code Playgroud)
这是TestPresenterFactory:
private class TestPresenterFactory …Run Code Online (Sandbox Code Playgroud) 我正在尝试开发一个服务器端应用程序,该应用程序可以管理事物(我不想详细介绍)。
该应用程序分为几个模块。这些包括但不限于:
所有上述模块都是解耦的,最上面的模块是IntegratedWebUI(集成UI)。所有模块仅公开接口,并且使用Guice IOC将这些接口连接在一起。
对于集成的UI,我想使用Spring。我知道,Spring附带了一个IOC容器,但我不希望其他模块了解Spring,以使其更具可互换性(就像更改它,而不接触其他模块)。
我的具体问题:以Spring试图从Guice注射器中取出豆子的方式,将Spring钩在Guice上是最优雅的方法吗?
我已经知道春天的果汁,某种程度上类似于这样。但是,我想完全取消IntegratedWebUI的耦合,并且永远不要更改WebUI模块内部的配置(因此,Guice注入器),即,通过更改guice模块的配置来更改行为。
在spring-guice的示例中,提供的钩子仅创建具体的Object,但是我希望能够告诉Spring:“尝试从Guice创建任何对象”(例如使用通用方法,这似乎是不可行的)。这样有什么可能吗?
Spring和Guice似乎都使用JSR330。是否可以编写一些通过Spring实例化并使用javax.inject。@ Inject从使用Guice连接的其他模块的依赖关系的Spring Controller?