为了账号安全,请及时绑定邮箱和手机立即绑定

可调用中的 Guice DI

可调用中的 Guice DI

慕莱坞森 2021-09-15 14:32:41
我有一个关于在并行环境中使用 Guice 的具体问题。我有一个 runnable,它接受构造函数参数。class task implements Runnable{String dbname="";task(String dbname){this.dbname=dbname}@Injectprivate ICacheService cacheServicepublic void run(){//logic here}bind(ICacheService).to(CacheServiceImpl.class);}问题:如何实例化 Task.我不能使用 ExecutorService.submit(新的,因为这不是正确的方法并且违背了 guice 的目的。)
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

我将创建一个创建任务的工厂,通过任务中的构造函数注入 ICacheService 并利用 javax.inject.Provider


public class TaskFactory {


    private Provider<ICacheService> cacheServiceProvider;


    @Inject

    public TaskFactory(Provider<ICacheService> cacheServiceProvider) {

        this.cacheServiceProvider = cacheServiceProvider;

    }


    public task create(String dbname) {

        return new task(dbname, cacheServiceProvider.get());

    }

}



class task implements Runnable {


    private final String dbname;

    private final ICacheService cacheService;


    public task(String dbname, ICacheService cacheService) {

        this.dbname = dbname;

        this.cacheService = cacheService;

    }


    @Override

    public void run() {


    }

}

完成此操作后,我将注入 TaskFactory,然后使用 dbName 调用 create 方法。


你也可以使用Guice 的AssistedInject来做类似的事情。


顺便说一句,类名应该以大写字母开头。


查看完整回答
反对 回复 2021-09-15
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

经过一点谷歌搜索,我找到了解决方案。捆绑:


public class DependecnyBinderModule extends AbstractModule {


    @Override

    protected void configure() {

        bind(CloudSync.class).to(AWSCloudSyncImpl.class);


        bind(IConfigurationPropertyInitializer.class).to(ConfigurationPropertyInitializerImpl.class);


        bind(ICloudClientProvider.class).to(CloudClientProvider.class);


        bind(IQueryConnection.class).to(QueryConnectionImpl.class);


        bind(IWorkSpaceDescriptorInitialization.class).to(WorkSpaceDescriptorInitialize.class);

        bind(ISubscribeQueue.class).to(SubScribeQueueImpl.class);


        bind(InitializeDataSource.class).to(InitializeDataSourceImpl.class);


        bind(InitiateQueueListening.class).to(InitiateQueueListeningImpl.class);


        bind(DataExtractor.class).to(DataExtractorImpl.class);


        bind(DataTransformer.class).in(Scopes.SINGLETON);

        bind(TaskDispatcher.class);

        **install(new FactoryModuleBuilder().implement(Runnable.class, MultiQueueConsumer.class).build(TaskCreatorFactory.class));**


    }


    @Provides

    @Singleton

    ThreadFactory providesThreadFactory() {

        return new ThreadFactoryBuilder().setDaemon(true).setNameFormat("RealTimeSync-%d")

                .setUncaughtExceptionHandler(new RealTimeSyncExceptionHandler()).build();

    }




}

您的 Task Dispatcher 将任务分派给 Executor。


import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.ThreadFactory;


import com.google.inject.Inject;


/**

 * @author marwaha

 *

 */

public class TaskDispatcher {

@Inject

private ThreadFactory factory;


@Inject


private RuunableFactory factory2;

    private ExecutorService executor;


    public void dispatch(String name) {

        if(executor==null) {

            executor=Executors.newFixedThreadPool(5, factory);

        }

        executor.submit(factory2.create(name));


    }


}

可运行工厂


public interface RuunableFactory {


    Task create(String dbname);

}


查看完整回答
反对 回复 2021-09-15
  • 2 回答
  • 0 关注
  • 160 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信