如何用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
相关产品推荐
相关产品推荐

