Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正确使用GWT RequestFactory ServiceLocator和DI_Java_Gwt_Guice_Requestfactory_Service Locator - Fatal编程技术网

Java 正确使用GWT RequestFactory ServiceLocator和DI

Java 正确使用GWT RequestFactory ServiceLocator和DI,java,gwt,guice,requestfactory,service-locator,Java,Gwt,Guice,Requestfactory,Service Locator,我第一次使用RequestFactory(RF)进行试验,并且正在努力实现我的第一个ServiceLocator 从RequestContext: // Sign a user in or out of the app. @ServiceName( value="com.myapp.server.DefaultSignInOutService", locator="com.myapp.server.DefaultSignInOutServiceLocator" ) public

我第一次使用RequestFactory(RF)进行试验,并且正在努力实现我的第一个
ServiceLocator

RequestContext

// Sign a user in or out of the app.
@ServiceName(
    value="com.myapp.server.DefaultSignInOutService",
    locator="com.myapp.server.DefaultSignInOutServiceLocator"
)
public interface SignInOutService extends RequestContext {
    public Request<String> signIn(SignIn signIn);
    public Request<Void> signOut(SignOut signOut);
}
我的理解是,
ServiceLocator
s基本上是服务实现的工厂。如果这是真的,那么如果我正在为服务器端DI使用Guice,我需要从定位器的构造函数内部初始化我的Guice模块。但是,如果我需要自己编写任何代码(在应用程序的其他地方)来创建
DefaultSignInOutServiceLocator
的实例并显式调用其
getInstance()
方法,那么我不需要将
ServiceLocatorModule
放入
DefaultSignInOutServiceLocator
中。在这种情况下,我可以编写如下代码:

public class DefaultSignInOutServiceLocator implements ServiceLocator {
    @Injected
    private DefaultSignInOutService signInOutService;

    @Override
    public Object getInstance(Class<?> clazz) {
        return signInOutService;
    }

    // Getters/setters, etc.
}
公共类DefaultSignInOutServiceLocator实现ServiceLocator{
@注入
私人违约信号服务信号服务;
@凌驾
公共对象getInstance(类clazz){
返回信号服务;
}
//接受者/接受者等。
}
下面是我的问题:

  • ServiceLocator
    impls是否是放置Guice模块(从而从其中引导DI)的合适位置?否则,如何向定位器注入正确连接/配置的服务impl
  • 或者,我只是不理解
    ServiceLocator#getInstance()
    的目的吗
  • 如果我的思路正确,那么注入的
    signInOutService
    应该是什么“范围”(springdi术语)?它应该是单态还是多态/原型?我是否需要担心这里的线程安全(多个线程获得相同的
    signInOutService
    实例)?或者GWT是否以某种方式确保RequestFactoryServlet以线程安全的方式访问定位器

  • ServiceLocator
    s由
    ServiceLayerDecorator
    实例化,您可以自己插入


    ServiceLocator
    s和它们创建的服务实例几乎是单例(如果可用内存不足,它们可能会被垃圾收集,然后重新创建新实例),因此您应该将它们配置为您这边的单例,或者至少确保您这样对待它们(即,为请求范围内的值(如当前用户)注入
    提供程序
    s)

    你可以在

    Thank@ThomasBroyer(+1)找到一个完整的Maven原型示例-我今晚回家后会查看你的原型。同时,两个快速跟进:(1)你能确认
    ServiceLocators
    是放置Guice模块的合适位置吗?或者你是说我应该实现自己的
    servicelayercorator
    并将Guice模块放在那里?以及(2)
    ServiceLocator\getInstance(类)的频率是多少
    方法调用?每个HTTP请求调用一次,或者在应用程序服务器启动时调用一次?再次感谢!(1)在我看来,您应该实现自己的
    ServiceLayerCorator
    (2)
    ServiceLocator\getInstance(Class)
    在第一次需要时调用一次(不是在启动时,而是在惰性中)并且返回的实例被放入缓存中;当内存不足时,缓存可能会被清除(缓存正在使用
    SoftReference
    s),因此
    getInstance
    可能会在以后再次调用(这取决于服务实例的生命周期)。请注意,这也适用于
    ServiceLocator
    实例!
    public class DefaultSignInOutServiceLocator implements ServiceLocator {
        @Injected
        private DefaultSignInOutService signInOutService;
    
        @Override
        public Object getInstance(Class<?> clazz) {
            return signInOutService;
        }
    
        // Getters/setters, etc.
    }