You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Dagger注解实现工厂模式?避免手动实例化实现类

优化方案:利用Guice自动管理策略类实例

要实现无需手动new每个策略类实例,核心是利用Guice的Multibinder特性自动收集所有AbstractRawPathStrategy的实现类,再注入到工厂中。以下是具体步骤:

1. 标记策略实现类为Guice可管理

给每个AbstractRawPathStrategy的实现类添加@Singleton注解(确保单例复用,无需单例可省略),同时保证类的构造方法支持Guice注入(无参构造或带@Inject的构造方法):

@Singleton
public class GetDocumentImpl implements AbstractRawPathStrategy {
    @Override
    public String getRouteKey() {
        return "GET_DOCUMENT";
    }

    @Override
    public void processRequest() {
        log.info("Inside get document");
    }
}

@Singleton
public class GetUserRightsImpl implements AbstractRawPathStrategy {
    @Override
    public String getRouteKey() {
        return "GET_USER_RIGHTS";
    }

    @Override
    public void processRequest() {
        log.info("Inside get user rights");
    }
}

2. 用Multibinder批量绑定策略类

修改AppModule,通过Multibinder将所有策略实现类绑定到Set<AbstractRawPathStrategy>集合中,Guice会自动创建这些类的实例并注入集合:

@Module
public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        // 创建策略类的Multibinder
        Multibinder<AbstractRawPathStrategy> strategyBinder = Multibinder.newSetBinder(binder(), AbstractRawPathStrategy.class);
        
        // 绑定每个实现类,新增策略时只需添加此行
        strategyBinder.addBinding().to(GetDocumentImpl.class);
        strategyBinder.addBinding().to(GetUserRightsImpl.class);
    }
}

3. 简化工厂类的注入

给RawPathStrategyFactory添加@Singleton注解,利用其已有的@Inject构造方法,让Guice自动注入Set<AbstractRawPathStrategy>并创建工厂实例,无需手动编写@Provides方法:

@Singleton
public class RawPathStrategyFactory {
    private final Map<String, AbstractRawPathStrategy> dictionary;

    @Inject
    public RawPathStrategyFactory(final Set<AbstractRawPathStrategy> abstractRawPathStrategySet) {
        dictionary = new HashMap<>();
        for (AbstractRawPathStrategy strategy : abstractRawPathStrategySet) {
            dictionary.put(strategy.getRouteKey(), strategy);
        }
    }

    public AbstractRawPathStrategy getByRouteKey(final String rawPath) {
        return dictionary.get(rawPath);
    }
}

进阶优化:类路径扫描自动绑定(可选)

如果策略类数量较多,不想手动添加addBinding(),可以引入Guice扩展库(如Guicey)实现类路径扫描,自动发现并绑定所有AbstractRawPathStrategy的实现类,进一步简化配置:

// 以Guicey为例,配置扫描包路径
@GuiceyScan(basePackages = "com.your.package.strategies")
public class AppModule extends AbstractModule {
    // 无需手动绑定,Guicey会自动扫描并绑定所有AbstractRawPathStrategy实现类
}

内容的提问来源于stack exchange,提问作者Nitika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:20:31